Boost.Fiber when_all, heterogeneous types


when_all, heterogeneous types - 이기종 유형

하지만 다양한 유형의 모든 결과를 기다려야 하는 경우는 어떻습니까?

우리는 솔직히 꽤 멋진 API를 제시할 수 있습니다. 샘플 구조체를 고려해보세요. 동시에 실행되는 작업 함수에서 해당 멤버를 채워보겠습니다. 이 경우 가장 빠른 결과를 먼저 캡처한다는 개념을 포기합니다.
전달된 구조체를 왼쪽에서 오른쪽 순서로 정확하게 채워야 합니다.

이를 통해 매우 간단한 구현이 가능합니다. 다음과 같이 wait_all_members()를 한 줄로 구현하려고 시도하는 것이 좋습니다. 이 전술의 문제점은 모든 작업 기능을 함수를 직렬화한다는 것입니다.   런타임은 각각에 대해 fibers::async()를 호출한 다음 반환된 future<>에 대해 future::get()을 즉시 호출하는 함수를 통해 단일 전달을 수행합니다.   이는 암시적 루프를 차단합니다. 위의 내용은 다음과 같이 작성하는 것과 거의 동일합니다. 물론 동시성이 전혀 없습니다.

함수 호출 경계(wait_all_members_get())를 통해 인수 팩을 전달하면 런타임이 강제로 두 가지 단계를 수행하게 됩니다.   하나는 wait_all_members()에서 모든 async() 호출에서 future<>를 수집하고, 두 번째는 wait_all_members_get()에서 각 결과를 가져옵니다.

설명에서 언급했듯이 wait_all_members_get() 매개변수 팩 확장 패스 내에서 get()의 차단 동작은 관련이 없게 됩니다.   그 과정에서 가장 느린 작업 함수에 대해 get()을 누르게 됩니다.   그 후 모든 후속 get()은 짧은 시간 내에 완료됩니다.

그런데 동일한 API를 사용하여 벡터나 다른 컬렉션을 채울 수도 있습니다.

⚛ 원문
Email 답글이 올라오면 이메일로 알려드리겠습니다.