代码之家  ›  专栏  ›  技术社区  ›  alfC

是否在出现异常的情况下使用for峎each?std::异常列表

  •  2
  • alfC  · 技术社区  · 6 年前

    https://en.cppreference.com/w/cpp/algorithm/for_each 说:

    • 三个标准政策 调用std::terminate

    for_each

    我希望使用异常的原因是为了能够部分撤消(恢复)在 每个人 打电话。

    不过,我偶然发现了 每个人

    http://man.hubwiz.com/docset/C.docset/Contents/Resources/Documents/output/en/cpp/algorithm/for_each.html

    • 如果策略是std::parallel_vector_execution_policy,则调用std::terminate
    • 如果策略是std::sequential_execution_policy或std::parallel_execution_policy, . 如果只有一个未捕获的异常,算法可能会重新抛出它,而不会在std::exception_列表中包装。在遇到第一个异常之后返回之前,该算法将执行多少工作,这是未指定的。

    这似乎意味着 terminate

    std::exception_list 被淘汰了?,是不是太有争议,太复杂,太昂贵(内存)?

    即使我同意这个逻辑,我真的没有其他选择,因为并行 每个人 退货 void (而不是UnaryFunction back,这也令人惊讶)。 因此, 这 每个人 说明。

    是否有理由期待一些新的定制政策,例如。 par_with_failed_list 会出现在某个地方 undo 惯性导航与制导。


    更多上下文 uninitialized_value_construct_n 当(任何未排序的)构造失败时,“撤消”(销毁)初始化的对象。


    编辑1 这个变量可以是一个共享的并发数据,可以在异常发生时存储异常(作为异常列表)。 我不知道这是否已经做过了。


    :我找到了一个 exception_list 在HPX中,
    https://github.com/STEllAR-GROUP/hpx/blob/master/hpx/exception_list.hpp
    https://github.com/STEllAR-GROUP/hpx/blob/master/src/exception_list.cpp

    0 回复  |  直到 6 年前
        1
  •  1
  •   Anthony Williams    6 年前

    std::exception_list 为并行算法的规范和实现增加了许多复杂度,但没有相应的增益。

    struct exception_info{
        ElementType* element;
        std::exception_ptr exception;
    };
    std::vector<exception_info> exceptions;
    std::mutex exceptions_mutex;
    
    std::vector<ElementType> range=...;
    
    std::for_each(std::execution::par,range.begin(),range.end(),[&](ElementType& element){
        try{ do_stuff(element); }
        catch(...){
            std::lock_guard guard(exceptions_mutex);
            exceptions.push_back({&element,std::current_exception()});
        }});
    

    这个 exceptions list现在将包含指向引发异常的元素和引发的异常的指针列表。