我的理解可能不正确但是,阅读call_once
的文档,似乎如果多个线程同时使用相同的once_flag
调用它并且第一个线程抛出异常,则另一个线程将调用其callable(等等,直到一个callable返回而不抛出)。
我的问题是,如果我有多个线程所有具有相同的可调用性,并且我希望无论异常如何都可以真正调用一次callable并且我想知道异常,我别无选择,只能这样做:
void call_really_just_once()
{
std::exception_ptr e;
std::call_once(some_once_flag_, [&]
{
try
{
may_throw();
}
catch(...)
{
e = std::current_exception();
}
});
if(e)
{
std::rethrow_exception(e);
}
}