我遇到了奇怪的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测试了代码,没有出现问题,所以我猜应该是系统配置有关,但我不知道是怎么回事。