に を設定するset_wait_callback
と、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) への最初の呼び出しは、待機関数を呼び出したスレッドで遅延関数を呼び出すものとします。