我想了解如何使用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));
}
第一個版本永遠阻塞,我不明白爲什麼。另一方面,第二個版本afaik會受到虛假喚醒的影響。正如我之前所說的,在實際的代碼,這一切都是一個類裏面的地方,所以,需要使用帶有謂詞的過載,我將不得不做一些像
cond.timed_wait(lock,dt, ?bind?(&Foo::isDone,this));
但後來我不是100%肯定,如果一個虛假喚醒將使timed_wait
回報true
(如果這是我的while (x > local_time())
將是多餘的情況。