如果我在一個boost::unique_future
設置set_wait_callback
,是它保證只運行一次?boost :: future - 是否保證wait_callback只能被調用一次?
我是有點懷疑的源代碼看時,因爲我發現了以下內容:
struct relocker
{
boost::unique_lock<boost::mutex>& lock;
relocker(boost::unique_lock<boost::mutex>& lock_):
lock(lock_)
{
lock.unlock();
}
~relocker()
{
lock.lock();
}
private:
relocker& operator=(relocker const&);
};
void do_callback(boost::unique_lock<boost::mutex>& lock)
{
if(callback && !done)
{
boost::function<void()> local_callback=callback;
relocker relock(lock); // unlock mutex?
local_callback();
}
}
void wait(bool rethrow=true)
{
boost::unique_lock<boost::mutex> lock(mutex);
do_callback(lock);
while(!done)
{
waiters.wait(lock);
}
if(rethrow && exception)
{
boost::rethrow_exception(exception);
}
}
凡do_callback
而調用回調函數,它從我的理解可能會導致互斥量實際上是解鎖如果多個線程調用wait
函數,該回調將被多次調用?
可以在回調被調用多次?它是否由設計?或者我錯過了什麼?
我有點驚訝的原因是,在C++ 11標準async(std::launch::deferred, ...)
(到set_wait_callback
是表弟),似乎有一個調用的保證:
§30.6.8
在功能完成之前,共享狀態還沒有準備好。 第一呼叫到 異步返回對象參照該共享狀態應調用 在調用等待功能線程延遲功能在非定時等待功能(30.6.4)。
https://svn.boost.org/trac/boost/ticket/7798 – ronag 2012-12-15 11:54:02
的問題是複雜得多,它似乎乍一看。從文檔看來,每次調用wait函數時都應該調用回調函數。 「效果: 存儲與*這是一個等待回調這將替換所有現有的等待回調店旁邊那個結果相關聯的異步結果f副本如果一個線程隨後調用在未來或升壓的等待功能之一。 :: shared_future與此結果關聯,並且結果尚未準備好,則應調用f(* this)。「 – 2012-12-15 14:22:45