Sleep flow boost for several nanoseconds

I want the accelerating thread to sleep within a few nanoseconds. The following code is a sample that compiles without errors. However, it does not work properly, and I cannot understand why.

#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 is a preprocessor definition needed to work with nanoseconds ( more ). Problems arise when I set the -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG parameter, then boost :: this_thread :: sleep does not work for any posix :: time_duration. The created thread uses the entire processor, and it does not sleep or process the remaining instructions. If the preprocessor definition is removed, the thread can sleep for any period of time if boost :: posix_time :: nanoseconds. The program uses some time_duration variables to store nanoseconds, and this makes boost :: this_thread :: sleep inoperative.

Thanks so much for your time.

+6
source share
2 answers

BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG ptime .

boost::this_thread::sleep is a compiled function that was compiled (on your distribution) without this definition, so it expects ptime arguments accurate to microseconds. You pass ptime arguments accurate to nanoseconds and the function does not work.

If you extract the code from the boost library and compile it with the definition turned on, the program works as expected:

 #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 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; } 
+7
source

Some sleep functions return earlier when they are mixed up, so you need to check the return value of the function and call it again until they return zero.

+2
source

Source: https://habr.com/ru/post/892404/


All Articles