我相信这是一种竞争条件,虽然是非常罕见的。具有持续时间的condition_variable :: timed_wait()的实现只需使用get_system_time()+ wait_duration将该值转换为system_time。如果系统时间在调用get_system_time()之间发生变化,并且计算出的等待结束时间被重新转换为基础操作系统调用的基于刻度的计数器,那么您的等待时间将会错误。
为了验证这一想法,在Windows上,我写了一个简单的程序有一个线程产生一些输出每100ms,就像这样:
for (;;)
{
boost::this_thread::sleep(boost::get_system_time() +
boost::posix_time::milliseconds(100));
std::cout << "Ping!" << std::endl;
}
另一个线程设置系统时间回到一分钟过去每100毫秒(此线程使用的操作系统级别的“睡眠()”调用,它避免了转换系统时间):“中国平安”
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);
}
第一个线程,但应该输出每100毫秒,锁定相当快。
除非我遗漏了一些东西,看来Boost并没有提供任何API来避免内部转换为系统时间的这个问题,从而使应用程序易受外部时钟变化的影响。
@Roddy:OK,但对于记录你的答案的时候符合我的实验结果。 – indiv 2014-01-06 18:56:39