bfiber_1000
Boost.Fiber when_any/when_all functionality
when_any/when_all functionality
📦 Overview - 개요
컴퓨팅 초기의 지혜는 오늘날에도 여전히 유효합니다.
부울 플래그보다는 명령 포인터를 사용하여 프로그램 상태를 모델링하는 것을 선호합니다.
즉, 프로그램이 "무언가를 수행"한 다음 거의 동일하지만 약간만 변경한 작업을 수행한다면...
내부 동작을 변경하기 위해 플래그를 도입해서 하나의 거대한 함수(a monolithic function)를 만드는 대신, 그 일부를 더 작은 별도의 함수로 분리해야 할 것입니다.
⚛ monolithic function 설명 (chatgpt)
여기에 추가할 사항은 다음과 같습니다. if, while, for, do et al과 같은 함수 호출과 같은 C++ 기본 구성을 사용하여 제어 흐름을 설명하는 것을 선호합니다. (콜백 체인이 아닌)
Boost.Fiber의 가장 큰 장점 중 하나는 해당 파이버의 코드가 실제로 다른 파이버(other fibers)에서 실행되는 코드와 인터리브되는 경우에도 콜백 체인에서 간단한 C++ 문 시퀀스로 응용 프로그램을 재구성할 수 있도록 개발자(coder)에 유연성을 부여한다는 것입니다.
최근 when_any 및 when_all 기능의 이점에 대한 많은 논의가 있었습니다.
비동기적이고 신뢰할 수 없는 서비스를 처리할 때 이는 귀중한 관용어(valuable idioms)입니다.
그러나 물론 'when_any'와 'when_all'은 콜백 체인 사용과 밀접하게 연결되어 있습니다.
이 섹션에서는 하나 이상의 다른 독립적인 활동이 완료되었을 때 "무언가를 수행(do something)"하려는 파이버의 맥락에서 동일한 목적을 달성하기 위한 방법을 제시합니다.
따라서 이들은 when_something() 함수가 아닌 wait_something() 함수입니다.
호출 파이버는 이러한 독립적인 활동을 시작하도록 요청한 다음 이를 기다린 다음 해당 결과에 따라 모든 처리를 순차적으로 진행합니다.
표시된 함수 이름(예: wait_first_simple())은 설명 목적으로만 제공됩니다.
이러한 모든 함수는 단일 소스 파일에 번들로 포함되어 있기 때문입니다.
아마도 wait_first_success()가 애플리케이션 요구 사항에 가장 적합하다면 wait_any()라는 이름으로 해당 변형을 도입할 수 있을 것입니다.
• Note
이 섹션에 제시된 함수는 작업(task) 함수의 가변 인수 목록을 허용합니다.
작업 함수의 컨테이너를 받아들이는 해당 wait_something() 함수는 관심 있는 독자를 위한 연습 문제로 남겨 둡니다.
실제로는 더 간단해야 합니다.
대부분의 복잡성은 두 가지 목적 모두에 대해 동일한 이름을 오버로드함으로써 발생합니다.
이 섹션의 모든 소스 코드는
'wait_stuff.cpp'에 있습니다.
📦 Example Task Function - 작업 함수 예제
우리는 이 함수를 사용하여 비동기 작업을 모델링하는 것이 편리하다는 것을 알았습니다.
std::string, double 및 int에 대한 유형별 sleeper() "front ends"를 사용합니다.
'Verbose'는 생성 및 파괴에 대한 메시지를 std::cout에 인쇄합니다.
1. sleeper()는 시작 메시지를 인쇄합니다.
2. 지정된 밀리초 동안 절전(sleep) 모드로 전환됩니다.
3. 'thrw'가 true로 전달되면 전달된 항목에 대한 문자열 설명을 던집니다.
4. else는 전달된 항목을 반환합니다.
5. 나가는 도중에 sleeper()는 중지 메시지를 생성합니다.
이 함수는 다음에 제시된 다양한 함수에 대한 호출 예제에 포함됩니다.
하위 목차
- 1) when_any
- 2) when_all functionality