我想让一个boost线程睡眠几纳秒。下面的代码是一个编译时没有错误的示例。然而,它不像预期的那样工作,我不知道为什么。
#include <iostream>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time.hpp>
//Building options:
//-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -lboost_date_time-mt -lboost_thread-mt
void replay()
{
boost::posix_time::time_duration time1, time2;
time1=boost::posix_time::seconds(3);
std::cout << boost::posix_time::to_simple_string(time1) << std::endl;
boost::this_thread::sleep(time1);
time2=boost::posix_time::nanoseconds(987654321);
std::cout << boost::posix_time::to_simple_string(time2) << std::endl;
boost::this_thread::sleep(time2);
}
int main(int argc, char* argv[])
{
boost::thread replaythread(replay);
replaythread.join();
return 0;
}
BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG是为了处理纳秒(更多信息)而需要的预处理器定义。当我设置-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG构建选项时,就会出现问题,然后boost::this_thread::sleep对任何posix::time_duration都不起作用。创建的线程使用所有的CPU,它不休眠也不处理剩余的指令。如果移除预处理器定义,线程可以在任何时间段内休眠,除非boost::posix_time::纳秒。该程序使用一些time_duration变量来存储纳秒,这使得boost::this_thread::sleep不起作用。
非常感谢您的宝贵时间
BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
改变了ptime
的大小。
boost::this_thread::sleep
是一个编译函数,它是在没有这个定义的情况下编译的(在你的发行版上),所以它需要微秒精度的ptime参数。您正在传递纳秒级精度的ptime参数,函数失败。
如果您从boost库中提取代码并启用此定义进行编译,则程序将按预期工作:
#include <iostream>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time.hpp>
// the guts of boost_1_46_1/libs/pthread/thread.cpp's version of sleep()
boost::mutex sleep_mutex;
boost::condition_variable sleep_condition;
void mysleep(const boost::posix_time::time_duration& dur)
{
boost::system_time st = boost::get_system_time() + dur;
boost::unique_lock<boost::mutex> lk(sleep_mutex);
while(sleep_condition.timed_wait(lk, st));
}
void replay()
{
boost::posix_time::time_duration time1, time2;
time1=boost::posix_time::seconds(3);
std::cout << boost::posix_time::to_simple_string(time1) << std::endl;
mysleep(time1);
//boost::this_thread::sleep(time1);
time2=boost::posix_time::nanoseconds(987654321);
std::cout << boost::posix_time::to_simple_string(time2) << std::endl;
mysleep(time2);
//boost::this_thread::sleep(time2);
}
int main()
{
boost::thread replaythread(replay);
replaythread.join();
return 0;
}
一些睡眠函数在被中断时返回较早,因此您必须检查函数的返回值并再次调用它,直到它们返回零。