Спящий поток повышения в течение нескольких наносекунд - PullRequest
6 голосов
/ 09 июля 2011

Я хочу, чтобы поток бодрствования спал несколько наносекунд. Следующий код представляет собой пример, который компилируется без ошибок. Тем не менее, это не работает, как ожидалось, и я не могу понять, почему.

#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. Созданный поток использует весь процессор, и он не спит и не обрабатывает оставшиеся инструкции. Если определение препроцессора удалено, поток может находиться в спящем режиме в течение любого периода времени, если не boost :: posix_time :: наносекунд. Программа использует некоторые переменные time_duration для хранения наносекунд, и это делает boost :: this_thread :: sleep не работает.

Большое спасибо за потраченное время

Ответы [ 2 ]

7 голосов
/ 11 июля 2011

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;
}
2 голосов
/ 09 июля 2011

Некоторые спящие функции возвращаются рано, когда прерываются, поэтому вам нужно проверить возвращаемое значение функции и вызывать его снова, пока они не вернут ноль.

...