boost :: this_thread :: sleep_for睡眠时间比我预期的要长。

时间:2015-12-01 00:05:03

标签: c++ boost

我在我的多线程项目中使用了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。

1 个答案:

答案 0 :(得分:1)

Boost的sleep_for在大多数非Windows平台(nanosleep())上使用POSIX source功能。由内核决定何时唤醒被挂起的线程。

如果系统上有很多活动(许多线程做了很多工作),那么OS的线程调度程序可能需要一段时间才能绕过来唤醒一个线程。 nanosleep()仅保证您的线程不会在指定的持续时间之前被唤醒 - 在持续时间过后,它不能保证准确性。

我敢打赌,如果你改变你的测试程序来产生大量的工作线程,这些线程做了很多工作(比调用now()计算密集度更高),那么准确性将会直线下降。