bfiber_1000
Boost.Fiber when_any, produce first success
when_any, produce first success - 첫 번째 성공을 생성
"when_any" 기능에 대한 한 가지 시나리오는 신뢰할 수 없는 일부 웹 서비스에 중복적으로 접속하는 경우입니다.
속도가 느릴 뿐만 아니라 어느 하나라도 원하는 결과가 아닌 실패가 발생할 수 있습니다.
이러한 경우 wait_first_outcome()은 올바른 접근 방식이 아닙니다.
서비스 중 하나에서 빠르게 오류가 발생하고 다른 서비스에서 실제 답변이 나오는 경우, 오류가 먼저 도착했다는 이유만으로 오류를 선호하고 싶지는 않습니다.
하지만 wait_first_outcome()에 대해 이미 생성한 대기열< future< T > >을 고려하면 첫 번째 성공적인 결과를 전달하기 위해 인터페이스 함수를 쉽게 다시 캐스팅할 수 있습니다.
그렇다면 질문이 생깁니다. 모든 작업 함수가 예외를 발생시키면 어떻게 될까요?
그렇다면 우리는 그것에 대해 더 잘 알 것입니다.
C++ 병렬 처리 초안 기술 사양에서는 std::exception_ptrs 컬렉션을 전달할 수 있는 std::exception_list 예외를 제안합니다.
이것이 보편적으로 사용 가능해질 때까지 우리만의 'exception_list(예외 목록)'을 만들어 보겠습니다.
이제 wait_first_outcome_impl()을 사용하여 wait_first_success()를 빌드할 수 있습니다.
대기열에서 첫 번째 future<>만 검색하는 대신 이제 future<> 항목을 반복해야 합니다.
물론 우리는 그 반복을 제한해야 합니다!
카운트 생산자 파이버만 실행하면 (count+1)번째 buffered_channel::pop() 호출이 영원히 차단됩니다.
준비된 future<>가 주어지면 future::get_exception_ptr()을 호출하여 실패를 구별할 수 있습니다.
실제로 future<>에 예외가 아닌 결과가 포함되어 있으면 get_exception_ptr()은 nullptr을 반환합니다.
이 경우에는 future::get()을 자신있게 호출하여 해당 결과를 호출자에게 반환할 수 있습니다.
그러나 'std::exception_ptr'이 nullptr이 아니면 이를 보류 중인 예외 목록에 수집하고 큐에서 다음 future<>를 위해 루프백합니다.
루프에서 벗어나면(모든 단일 작업 파이버가 예외를 발생시키는 경우) 'std::exception_ptrs'를 수집했던 'exception_list' 예외를 발생시킵니다.
호출은 다음과 같습니다.