Я считаю, что это состояние гонки, хотя и очень редкое.Реализация condition_variable :: timed_wait () с длительностью просто преобразует значение в system_time, используя get_system_time () + wait_duration.Если системное время изменяется между временем вызова get_system_time () и вычисленное время окончания ожидания конвертируется в основанный на тиках счетчик для основного вызова ОС, ваше время ожидания будет неправильным.
Чтобы проверить этоПо идее, в Windows я написал простую программу с одним потоком, генерирующим некоторый вывод каждые 100 мс, например:
for (;;)
{
boost::this_thread::sleep( boost::get_system_time() +
boost::posix_time::milliseconds( 100 ) );
std::cout << "Ping!" << std::endl;
}
Другой поток возвращал системное время на одну минуту в прошлом каждые 100 мс (этот поток используетвызов на уровне ОС «Sleep ()», который предотвращает преобразование в системное время):
for ( ;; )
{
Sleep( 100 );
SYSTEMTIME sysTime;
GetSystemTime( &sysTime );
FILETIME fileTime;
SystemTimeToFileTime( &sysTime, /*out*/&fileTime );
ULARGE_INTEGER fileTime64 = (ULARGE_INTEGER(fileTime.dwHighDateTime) << 32) |
fileTime.dwLowDateTime;
fileTime64 -= 10000000 * 60; // one minute in the past
fileTime.dwHighDateTime = (fileTime64>>32) & 0xFFFFFFFF;
fileTime.dwLowDateTime = fileTime64 & 0xFFFFFFFF;
FileTimeToSystemTime( &fileTime, /*out*/&sysTime );
SetSystemTime( &sysTime );
}
Первый поток, хотя и должен выводить «Ping!»каждые 100 миллисекунд, довольно быстро блокируются.
Если только я чего-то не упустил, похоже, что Boost не предоставляет API-интерфейсы, позволяющие избежать этой проблемы внутренних преобразований в системное время, что делает приложения уязвимыми для внешних изменений вчасы.