Как спать C ++ Boost Thread - PullRequest
       26

Как спать C ++ Boost Thread

35 голосов
/ 24 ноября 2010

Кажется невозможным уснуть поток, используя boost :: thread.Метод sleep требует system_time, но как я могу его построить?

Просмотр библиотек не очень помогает ...

По сути, у меня есть поток внутри функции, который я передаю этому потокув качестве точки входа я хотел бы назвать что-то вроде

 boost::this_thread::sleep

или что-то еще, как это сделать?

Спасибо

Ответы [ 4 ]

87 голосов
/ 24 ноября 2010

В зависимости от вашей версии Boost:

Либо ...

#include <boost/chrono.hpp>
#include <boost/thread/thread.hpp> 

boost::this_thread::sleep_for(boost::chrono::milliseconds(100));

Или ...

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp> 

boost::this_thread::sleep(boost::posix_time::milliseconds(100));

Вы также можете использовать микросекунды, секунды,минуты, часы и, возможно, некоторые другие, я не уверен.

22 голосов
/ 27 марта 2015

Из другого поста я узнал, boost::this_thread::sleep устарела для Boost v1.5.3: http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html

Вместо этого попробуйте

void sleep_for(const chrono::duration<Rep, Period>& rel_time);

например

boost::this_thread::sleep_for(boost::chrono::seconds(60));

Или, может быть, попробуйте

void sleep_until(const chrono::time_point<Clock, Duration>& abs_time);

Я использовал Boost v1.53 с устаревшей функцией sleep, и она периодически вызывала сбой программы.Когда я изменил вызовы функции sleep на вызовы функции sleep_for, программа перестала падать.

4 голосов
/ 05 сентября 2013

во-первых

boost::posix_time::seconds secTime(1);  
boost::this_thread::sleep(secTime); 

во-вторых

boost::this_thread::sleep(boost::posix_time::milliseconds(100));
0 голосов
/ 17 мая 2016

Я усвоил трудный путь, что по крайней мере в MS Visual Studio (пробовал 2013 и 2015 годы) существует огромная разница между

boost::this_thread::sleep(boost::posix_time::microseconds(SmallIterval));

и

boost::this_thread::sleep_for(boost::chrono::microseconds(SmallIterval));
or
std::this_thread::sleep_for(std::chrono::microseconds(SmallIterval));

когда интервал меньше некоторого довольно существенного порога (я видел порог в 15000 микросекунд = 15 миллисекунд).

Если SmallIterval маленький, sleep () делает мгновенное прерывание. сон (100 мкс) ведет себя как сон (0 мкс).

Но sleep_for () для интервала времени, меньшего порога, делает паузу для всего порога. sleep_for (100 мкс) ведет себя как sleep_for (15000 мкс).

Поведение для интервалов, превышающих пороговое значение, и для значения 0 одинаково.

...