2011-07-09 15 views
6

ブーストスレッドを数ナノ秒間スリープ状態にします。次のコードは、エラーなしでコンパイルするサンプルです。しかし、それは期待どおりに動作しないと私は理由を把握することはできません。数ナノ秒間ブーストスレッドをスリープ

#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は、ナノ秒(more info)で動作するために必要なプリプロセッサ定義です。この問題は、ビルドオプション-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIGを設定した後に、boost :: this_thread :: sleepがposix :: time_durationで機能しないときに発生します。作成されたスレッドはすべてのCPUを使用し、スリープも残りの命令も処理しません。プリプロセッサ定義が削除されている場合、スレッドはboost :: posix_time :: nanosecondsを除いて、任意の期間スリープすることができます。 プログラムはtime_duration変数を使用してナノ秒を格納します。これにより、boost :: this_thread :: sleepが機能しなくなります。

は、関数の戻り値をチェックし、彼らがゼロに戻るまでそれを再度呼び出す必要がありますので、interuptedとき

+1

あなたは動作しませんそれで何を意味するのですか?それは短くするか長くするか、全くしないか? nanosecsのstd :: cout行の出力は何ですか? – Nobody

+0

あなたは正しいです。私はポストをより良い説明で編集しました。ありがとうございました。 – Emer

+0

あなたはブーストのためにデバッグ情報とプログラムをリンクして、スリープ中に何が起こっているのか見てみましたか?私にとっては、それはスケジューラの限界をはるかに下回っているので、ナノ秒の間スリープする他の可能性がないので、忙しい待ち時間のように聞こえる。たぶん、何らかの理由で待っているループが戻ってこないかもしれない。 – Nobody

答えて

7

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; 
} 
+1

(私のmutexとcondvarはグローバルなので、このコードはデモ専用ですが、実際のライブラリではboost :: threadクラスの非静的なメンバーです) – Cubbi

+0

有益な答えをありがとうございます。私は 'b2'を使って定義したスレッドライブラリをビルドしようとしています。 'variant new_release:release: BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG;'という行を 'user-config.jam'に追加しました。 defineオプションをどこに含めるべきか知っていますか? – Emer

2

いくつかのスリープ機能が早期に戻るお時間をありがとうございました。

関連する問題