无论异常如何,都要调用`f()`一次

时间:2014-08-19 00:10:41

标签: c++ c++11 mutex

我的理解可能不正确但是,阅读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);
    }
}

0 个答案:

没有答案