>

cppreference 설명서 https://en.cppreference.com/w/cpp/algorithm/for_each 말합니다 :

와이즈 비즈 나는 이것이 바로
  • If execution of a function invoked as part of the algorithm throws an exception and ExecutionPolicy is one of thethree standard policies,std::terminate is called. For any other ExecutionPolicy, the behavior is implementation-defined.
에서 즉시 사용할 수 없다는 것을 의미한다고 해석합니다.  함수를 전달하고 excetion 또는 이와 관련된 정보를 잡을 것으로 예상합니다.

예외를 사용할 것으로 예상 한 이유는 for_each 에서 변경 한 내용을 부분적으로 취소 (복귀) 할 수 있기 때문입니다.  요구. 더 나은 알고리즘이있을 수 있습니다.

그러나 우연히 나는 for_each 의 역사적 버전을 발견했습니다.  다른 흥미로운 행동을하는 것으로 문서화되어 있습니다 :

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

와이즈 비즈

for_each 대신에 실제로 예외를 사용할 가능성이 있습니다.

  • if policy is std::parallel_vector_execution_policy, std::terminate is called
  • if policy is std::sequential_execution_policy or std::parallel_execution_policy,the algorithm exits with an std::exception_list containing all uncaught exceptions. If there was only one uncaught exception, the algorithm may rethrow it without wrapping in std::exception_list. It is unspecified how much work the algorithm will perform before returning after the first exception was encountered.
 너무 논란이 많고 너무 복잡하고 (메모리) 비용이 많이 들었습니까?

논리에 동의하더라도 병렬 terminate 때문에 다른 옵션이 없습니다.   std::exception_list 를 반환  (UnaryFunction back 대신에, 이것은 또한 놀랍습니다). 따라서, 이 for_each  프로토콜이 완료되지 않은 void 를 실행 취소하는 데 필요한 구성 요소로 보입니다.  지시.

예를 들어 새로운 사용자 지정 정책을 기대하는 것이 합리적입니다. 와이즈 비즈   std::exception_list 를 허용하는 어딘가에 나타납니다 노래.

<시간>

자세한 내용:이 실패한 루프 실행 취소 패턴은 컨테이너 구성에 사용됩니다. 사용자 정의 (병렬/순서) for_each 를 구현하고 싶습니다.  (시퀀스되지 않은) 구성이 실패 할 때 초기화 된 개체를 "실행 취소"(파괴)합니다.

<시간>

EDIT1: 잠시 후 람다에서 캡처 된 변수를 함수 매개 변수에 전달할 수 있습니다. 이 변수는 예외가 발생할 때 예외를 예외 _ 목록으로 저장할 수있는 공유 동시 데이터 일 수 있습니다. 이 작업이 이미 완료되었는지 궁금합니다.

<시간>

EDIT2: par_with_failed_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

undo

  • 답변 # 1

    std::exception_list  이에 상응하는 이득없이 병렬 알고리즘의 사양 및 구현에 많은 복잡성을 추가했습니다.

    사용자는 functor에서이 사례를 처리 할 수 ​​있습니다.

    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()});
        }});
    
    

    와이즈 비즈  list에는 예외가 발생한 요소와 발생한 예외에 대한 포인터 목록이 포함됩니다.

    exceptions

  • 이전 Apache Beam에서 JSON 배열을 BigQuery 테이블로 스트리밍하는 방법
  • 다음 drupal 7 - nginxconf에서 client_max_body_size를 어떻게 늘리나요?