如果我在一个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