3. Coroutine
같은 스레드에서 제어권이 변경 되는 것이기 때문에 동기화 문제가 발생하지
않는다
쓰레드 보다 적은 비용이 든다
코루틴 객체는 힙에 생성이 된다
코루틴 객체의 수명에 유의 해야 한다
구현이 어렵다(C++, 개인적인 생각…)
4. 코루틴을 적용할 수 없는 함수들
가변 인자
일반 return 문을 사용
constexpr, consteval
생성자, 소멸자
main
5. 추가된 키워드
co_await 표현식 : 재개 될 때까지 일시 중지
std::size_t n = co_await socket.async_read_some(buffer(data));
co_yield 표현식 : 값을 반환하고 일시 중지
while (true) co_yield n++;
co_return 문 : 값을 반환하고 끝낸다
co_return 7;
6. 구현시 필요한 것들
promise
"코루틴 내부"에서 관리 되는 객체. 코루틴의 결과나 예외를 이 객체를 통해
호출자에게 전달 하는 용도로 사용
코루틴 핸들
"코루틴 외부"에서 관리 되는 객체. 코루틴을 resume하거나 코루틴 프레임을
제거 할 때 사용
코루틴 프레임
"힙 메모리 영역"에 할당 되는 코루틴 상태를 나타내는 객체
8. 코루틴 핸들
promise_type이라는 내부 형식을 정의하고 있어야한다
직접 정의하거나 std::coroutine_traits를 Generator로 특수화한
std::coroutine_traits<Generator>를 public 형식 멤버 promise_type으로 두어도
된다.
9. 코루틴 프레임
약속 객체, 코루인 인수들의 복사본, 정지 시점을 나타내는 객체, 내부의 지역 변수
등으로 구성됨
대기 가능 객체
코루틴이 일시정지 중인지 아닌지 판정
대기자 객체
대기 가능 객체가 종료 혹은 일시 정지 되길 기다리는 객체
co_await 연산자를 정의하거나 대기 가능 객체를 대기자 객체로 변환해야 한다
10. 대기 가능 객체
Awaitable 콘셉트를 충족해야 함
정의 되어있는 std:: suspend_always 와 std::suspend_never 타입을 사용해도 된다