我在我的多线程项目中使用了boost sleep_for,发现它睡得比我想象的要长得多。
像这样的声明:boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
可能需要0.1秒或2秒甚至10秒。
但是在我的测试程序中,它运行正常。
int main(void)
{
for (int i = 0; i < 100; i++) {
auto start = boost::chrono::system_clock::now();
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
auto end = boost::chrono::system_clock::now();
std::cout << (end-start).count() << std::endl;
}
return 0;
}
我在Mac OS 10.10上使用clang-602.0.53和Boost版本是1.58。
答案 0 :(得分:1)
Boost的sleep_for
在大多数非Windows平台(nanosleep())上使用POSIX source功能。由内核决定何时唤醒被挂起的线程。
如果系统上有很多活动(许多线程做了很多工作),那么OS的线程调度程序可能需要一段时间才能绕过来唤醒一个线程。 nanosleep()
仅保证您的线程不会在指定的持续时间之前被唤醒 - 在持续时间过后,它不能保证准确性。
我敢打赌,如果你改变你的测试程序来产生大量的工作线程,这些线程做了很多工作(比调用now()
计算密集度更高),那么准确性将会直线下降。