3

我遇到了奇怪的boost::sleep()功能问题。我有这个基本代码:

#include <sys/time.h>
#include <boost/chrono.hpp>
#include <boost/thread.hpp>

void thread_func()
{
    timeval start, end;
    gettimeofday( &start, NULL );
    boost::this_thread::sleep( boost::posix_time::milliseconds(1) ); // usleep(1000) here works just fine.
    gettimeofday( &end, NULL );

    int secs = end.tv_sec - start.tv_sec;
    int usec = end.tv_usec - start.tv_usec;
    std::cout << "Elapsed time: " << secs << " s and " << usec << " us" << std::endl;
}

int main()
{
    thread_func();

    boost::thread thread = boost::thread( thread_func );
    thread.join();

    return 0;
}

问题是boost::sleep()函数在创建的线程和主线程中的行为不同。这个程序的输出是

Elapsed time: 0 s and 1066 us
Elapsed time: 0 s and 101083 us

boost::sleep()函数在创建的线程中休眠 100 毫秒,而在主线程中工作正常(它休眠 1 毫秒)。如果我在创建的线程中,我无法获得低于 100 毫秒的精度(例如使用boost::posix_time::microseconds)。但是,如果我使用usleep(1000),它工作得很好。

我在 Intel i7 CPU 上使用 Fedora 18(64 位)3.8.4 和 Boost 1.50.0-5.fc18。我也在不同的PC上用Win 7 & Boost 1.48.0测试了代码,没有出现问题,所以我猜应该是系统配置有关,但我不知道是怎么回事。

4

2 回答 2

5

boost::this_thread::sleep已弃用(请参阅文档)。

usleep也已弃用(在 POSIX.1-2001 中已过时并从 POSIX.1-2008 中删除)。

FWIW,在我本地安装的较旧的(1.44)boost头文件中,boost::this_thread_sleep实际调用的相对延迟版本gettimeofday计算绝对截止日期,然后转发到绝对版本(这是离线编译的,所以我不随身携带)。请注意,这在 POSIX.1-2008gettimeofday被标记为已过时。

所有这些的建议替代品是:

  • boost::this_thread::sleep_for而不是...::sleep相对延迟
  • boost::this_thread::sleep_until而不是...::sleep绝对时间
  • nanosleep代替usleep
  • clock_gettime代替gettimeofday
于 2013-04-02T13:27:18.040 回答
0

请注意,调用 boost::this_thread::sleep() 和相关方法不仅会使线程进入睡眠状态,还会要求调度程序将 CPU 分配给准备好执行的另一个线程。因此,您实际上是在测量睡眠时间的最大值或线程再次获得 CPU 的时间。

于 2013-04-02T13:16:42.737 回答