bfiber_0500
Boost.Fiber Synchronization Futures
Synchronization Futures
📦 Overview
미래(The futures) 라이브러리는 해당 값이 다른 파이버에 의해 생성되거나,
외부 자극(stimuli)에 대한 응답으로 단일 파이버에서 생성되거나,
또는 요청 시(on-demand) 비동기 미래(future) 값을 처리하는 수단을 제공합니다.
이는 비동기 결과를 검색하는 데 사용되는 future<> 및 shared_future<>와 비동기 결과를 생성하는 데 사용되는 promise<> 및 packaged_task<>의 네 가지 클래스 템플릿 제공을 통해 수행됩니다.
future<>의 인스턴스는 결과에 대한 유일한 참조를 보유합니다.
이동 생성자(move constructor) 또는 이동 할당 연산자(move-assignment operator)를 사용하여 인스턴스 간에 소유권을 이전할 수 있지만 최대 하나의 인스턴스가 지정된 비동기 결과에 대한 참조를 보유합니다.
결과가 준비되면 'rvalue-reference'에 의해 future::get()에서 반환되어 해당 유형에 맞게 결과를 이동하거나 복사할 수 있습니다.
반면에 shared_future<>의 많은 인스턴스는 동일한 결과를 참조할 수 있습니다.
인스턴스는 자유롭게 복사하고 할당할 수 있으며, shared_future::get()은 const 참조를 반환하므로 shared_future::get()에 대한 여러 호출이 안전합니다.
future<> 인스턴스를 shared_future<> 인스턴스로 이동하여 관련 비동기 결과의 소유권을 이전할 수 있지만, 그 반대는 불가능합니다.
fibers::async()는 비동기 작업을 실행하는 간단한 방법입니다.
async()를 호출하면 파이버가 생성되고 파이버 함수의 결과를 전달하는 future<>가 반환됩니다.
📦 Creating asynchronous values - 비동기 값 생성
promise<> 또는 packaged_task<>를 사용하여 미래의 값을 설정할 수 있습니다.
packaged_task<>는 함수를 래핑하는 void return이 있는 호출 가능 객체 또는 지정된 유형을 반환하는 호출 가능 객체입니다.
packaged_task<>가 호출되면 포함된 함수를 차례로 호출하고 포함된 함수의 반환 값으로 future를 채웁니다.
이것은 "파이버에서 값을 어떻게 반환합니까?"라는 영원한(perennial) 질문에 대한 대답입니다.
packaged_task<>로 실행하려는 함수를 패키징하고 패키징된 작업을 파이버 생성자에 전달합니다.
그런 다음 패키지된 작업에서 검색된 future를 사용하여 반환 값을 얻을 수 있습니다.
함수에서 예외가 발생하면 해당 예외는 반환 값 대신 미래(future)에 저장됩니다.
promise<>는 좀 더 낮은 수준입니다.
단지 관련 'future'에 값이나 예외를 저장하는 명시적인 함수를 제공할 뿐입니다.
따라서 값이 둘 이상의 가능한 소스에서 나올 수 있는 경우 'promise'를 사용할 수 있습니다.