Я использую timed_wait из библиотеки boost C ++, и у меня возникает проблема с високосными секундами.
Вот быстрый тест:
#include <boost/thread.hpp>
#include <stdio.h>
#include <boost/date_time/posix_time/posix_time.hpp>
int main(){
// Determine the absolute time for this timer.
boost::system_time tAbsoluteTime = boost::get_system_time() + boost::posix_time::milliseconds(35000);
bool done;
boost::mutex m;
boost::condition_variable cond;
boost::unique_lock<boost::mutex> lk(m);
while(!done)
{
if(!cond.timed_wait(lk,tAbsoluteTime))
{
done = true;
std::cout << "timed out";
}
}
return 1;
}
Функция timed_wait возвращает 24 секундыраньше, чем следовало24 секунды - это текущее количество високосных секунд в UTC.
Итак, повышение широко используется, но я не смог найти информацию об этой конкретной проблеме.Кто-нибудь еще испытывал эту проблему?Каковы возможные причины и решения?
Примечания: Я использую boost 1.38 в системе Linux.Я слышал, что эта проблема не возникает в MacOS.
ОБНОВЛЕНИЕ: Немного больше информации: это происходит на 2-х redhat машинах с ядром 2.6.9.Я выполнил тот же код на машине с Ubuntu с ядром 2.6.30, и таймер ведет себя так, как и ожидалось.
Итак, я думаю, что это, вероятно, вызвано операционной системой или неправильной настройкойна машинах Redhat.
Я кодировал обходной путь, который корректирует время по UTC, а затем получает разницу от этой настройки и добавляет к исходному времени.Это выглядит как плохая идея для меня, потому что, если этот код выполняется на машине без этой проблемы, это может быть 24 секунды ВПЕРЕД.Все еще не смог найти причину этого.