Заспиване на усилваща нишка за няколко наносекунди

Искам усилваща нишка да заспи за няколко наносекунди. Следният код е примерен, който се компилира без грешки. Въпреки това не работи според очакванията и не мога да разбера защо.

#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::nanoseconds. Програмата използва някои променливи time_duration за съхраняване на наносекунди и това кара boost::this_thread::sleep да не работи.

Благодаря ви много за отделеното време


person Emer    schedule 09.07.2011    source източник
comment
Какво искаш да кажеш с това, че не работи? Спи ли твърде кратко или дълго или изобщо не спи? Какъв е резултатът от реда std::cout с наносеките?   -  person Nobody moving away from SE    schedule 09.07.2011
comment
Ти си прав. Редактирах публикацията с по-добро описание. Благодаря ти.   -  person Emer    schedule 11.07.2011
comment
Опитахте ли да свържете програмата с информация за отстраняване на грешки за усилване и да видите какво се случва, докато спи? За мен това звучи като натоварено чакане, което е ясно, тъй като няма друга възможност за заспиване за наносекунди, защото това е далеч под ограниченията на планировчиците. Може би цикълът, който чака, никога не се връща по някаква причина.   -  person Nobody moving away from SE    schedule 11.07.2011


Отговори (2)


BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG променя размера на ptime.

boost::this_thread::sleep е компилирана функция, която е компилирана (на вашата дистрибуция) без тази дефиниция, така че очаква аргументи ptime с точност до микросекунди. Предавате аргументи ptime с наносекунда точност и функцията се проваля.

Ако извлечете кода от библиотеката за повишаване и го компилирате с активирана тази дефиниция, програмата работи както се очаква:

#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;
}
person Cubbi    schedule 11.07.2011
comment
(имайте предвид, че този код е само за демонстрация, тъй като моят mutex и condvar са глобални, докато в истинската библиотека те са нестатични членове на класа boost::thread) - person Cubbi; 11.07.2011
comment
Благодаря ви много за полезния отговор. Опитвам се да изградя библиотеката с нишки с това дефиниране с помощта на b2. Добавих ред variant new_release : release : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG; към user-config.jam без успех. Знаете ли къде да включите опцията за дефиниране? - person Emer; 12.07.2011

Някои функции за заспиване се връщат по-рано, когато бъдат прекъснати, така че трябва да проверите върнатата стойност на функцията и да я извикате отново, докато върнат нула.

person fwg    schedule 09.07.2011