bfiber_1000
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를 사용하여 벡터나 다른 컬렉션을 채울 수도 있습니다.