2017-06-07 3 views
1

timed_waitの使い方を理解しようとしています。ほんのわずかの例(herehere)が見つかりました。絶対時間で呼び出すときに問題があります。次のコードは単純化された例ですが、実際にはすべてがクラス内で行われるため、バインディングを使用せずに手動で述語をチェックしてtimed_waitに渡す方が簡単だと思いました。絶対時間で呼び出されたときにboost :: timed_waitが永久にブロックされるのはなぜですか?

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

bool done = false; 
boost::mutex mutex; 
boost::thread waitingThread; 
boost::condition_variable cond; 

void wait(boost::posix_time::time_duration dt){ 
    boost::mutex::scoped_lock lock(mutex); 
    boost::system_time x = boost::posix_time::microsec_clock::local_time() + dt; 
    bool timedOut = false; 
    while((done == false) && (x > boost::posix_time::microsec_clock::local_time())) { 
     timedOut = ! cond.timed_wait(lock,x); 
    } 
    if (timedOut){ std::cout << "timeout\n"; } 
    else   { std::cout << "success\n"; } 
} 

void wait2(boost::posix_time::time_duration dt){ 
    boost::mutex::scoped_lock lock(mutex); 
    bool timedOut = ! cond.timed_wait(lock,dt); 
    if (timedOut){ std::cout << "timeout\n"; } 
    else   { std::cout << "success\n"; } 

} 

void test(){ 
    //boost::thread waiter = boost::thread(wait,boost::posix_time::milliseconds(50)); 
    boost::thread waiter = boost::thread(wait2,boost::posix_time::milliseconds(50)); 
    boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); 
} 

最初のバージョンは永遠にブロックされますが、その理由はわかりません。一方、第2版afaikは偽の起床の対象となります。私が前に言ったように、実際のコードでは、このすべては、私が

cond.timed_wait(lock,dt, ?bind?(&Foo::isDone,this)); 

ような何かをしなければならない述語を取りますが、その後、私は場合は100%を確認していないオーバーロードを使用するので、クラス内の場所でありますスプリアスウェイクアップはtimed_waitリターンtrue(これが事実であるならば、私のwhile (x > local_time())は不要だろう。wait_lock(...)は現在を比較するboost::get_system_time()を使用しているため、タイムゾーンを調整している代わりにlocal_time() + dtのUTCベースで

答えて

3

使用boost::get_system_time() + dtを、作ります目標絶対時間との時間。

次の例では、問題を示しています

int main() { 
    std::cout << "System time: " 
       << boost::get_system_time() << std::endl; 
    std::cout << "Local time: " 
       << boost::posix_time::microsec_clock::local_time() << std::endl; 
} 

出力:

System time: 2017-Jun-07 08:47:58.836677 
Local time: 2017-Jun-07 11:47:58.837003 

だから、あなたの絶対的な時間ベースのタイムゾーンで指定された数時間wait()機能ブロックだけではなく、永遠に、お使いのコンピュータのオフセット。

関連する問題