我遇到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)
,它就可以正常使用。
我正在使用Fedora 18(64位)3.8.4&amp;在Intel i7 CPU上提升1.50.0-5.fc18。我还使用Win 7&amp; S测试了不同PC上的代码。 Boost 1.48.0并没有出现问题,所以我猜它应该与系统配置有关,但我不知道如何。
答案 0 :(得分:5)
boost::this_thread::sleep
已弃用(see docs)。
usleep
也已弃用(在POSIX.1-2001中已过时,已从POSIX.1-2008中删除)。
FWIW,在本地安装的旧版(1.44)提升标题中,boost::this_thread_sleep
的相对延迟版本实际调用gettimeofday
来计算绝对截止日期,然后转发到绝对版本(这是在线外编译的,所以我没有它的方便)。请注意,gettimeofday
在POSIX.1-2008中已标记为过时。
所有这些建议的替代品是:
boost::this_thread::sleep_for
而非...::sleep
且相对延迟boost::this_thread::sleep_until
代替...::sleep
绝对时间nanosleep
代替usleep
clock_gettime
代替gettimeofday
答案 1 :(得分:-1)
请注意,调用boost :: this_thread :: sleep()和相关方法不仅会使线程进入休眠状态,还会要求调度程序将CPU提供给另一个可以执行的线程。因此,您可以实际测量睡眠时间的最大值或线程再次获得CPU的时间。