timed_wait
の使い方を理解しようとしています。ほんのわずかの例(hereとhere)が見つかりました。絶対時間で呼び出すときに問題があります。次のコードは単純化された例ですが、実際にはすべてがクラス内で行われるため、バインディングを使用せずに手動で述語をチェックして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ベースで