如果我在 aset_wait_callback
上设置 a boost::unique_future
,是否保证只运行一次?
我有点怀疑,因为在查看源代码时,我发现以下内容:
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)应调用调用等待函数的线程中的延迟函数。