콘텐츠로 이동

코루틴 (Coroutines)

C++20 코루틴은 프로젝트 리드가 승인한 라이브러리를 통해서만 사용하세요.

정의:

C++20은 코루틴을 도입했습니다. 실행을 중단했다가 나중에 다시 이어 갈 수 있는 함수입니다. 비동기 프로그래밍에 특히 편리하며, 그 영역에서는 전통적인 콜백 기반 프레임워크보다 상당히 나은 결과를 낼 수 있습니다.

다른 대부분의 프로그래밍 언어(Kotlin, Rust, TypeScript 등)와 달리 C++는 코루틴의 구체적인 구현을 제공하지 않습니다. 대신 사용자가 promise 타입을 사용해 자신만의 awaitable 타입을 구현하도록 요구합니다. 이 타입이 코루틴의 매개변수 타입과 코루틴이 실행되는 방식을 결정하며, 실행의 여러 단계에서 사용자 정의 코드를 돌릴 수 있게 해 줍니다.

장점:

  • 코루틴은 비동기 프로그래밍처럼 특정한 작업에 알맞은 안전하고 효율적인 라이브러리를 구현하는 데 쓸 수 있습니다.
  • 코루틴은 문법적으로 코루틴이 아닌 함수와 거의 같아서, 대안들보다 훨씬 읽기 좋을 수 있습니다.
  • 사용자 정의의 폭이 넓기 때문에, 대안들에 비해 더 자세한 디버깅 정보를 코루틴 안에 넣을 수 있습니다.

단점:

  • 표준 코루틴 promise 타입이 없어서, 사용자가 정의한 구현마다 어떤 면에서는 제각각일 가능성이 높습니다.
  • 반환 타입, promise 타입의 여러 사용자 정의 훅, 컴파일러가 생성하는 코드가 서로 맞물려 동작을 결정하기 때문에, 코루틴의 의미론은 사용자 코드를 읽는 것만으로 추론하기가 대단히 어렵습니다.
  • 코루틴에서 사용자 정의가 가능한 부분이 많다는 것은 곧 함정도 많다는 뜻이며, 댕글링 참조와 경쟁 조건 주변에서 특히 그렇습니다.

요컨대 품질 좋고 상호 운용 가능한 코루틴 라이브러리를 설계하려면 어려운 작업과 신중한 고민, 그리고 방대한 문서가 많이 필요합니다.

결정:

프로젝트 리드가 프로젝트 전체에서 쓰도록 승인한 코루틴 라이브러리만 사용하세요. promise 타입이나 awaitable 타입을 직접 만들지 마세요.


옮긴이 풀이

핵심: 승인된 라이브러리를 통해서만 사용

C++20 코루틴은 실행을 멈췄다 재개할 수 있는 함수로, 비동기 프로그래밍에 유용합니다. 하지만 C++는 구체적 구현을 제공하지 않아, 사용자가 promise·awaitable 타입을 직접 만들어야 하며 이는 매우 어렵고 함정(댕글링 참조, 경쟁 조건)이 많습니다.

규칙

  • 프로젝트 리드가 승인한 코루틴 라이브러리만 쓰세요.
  • 직접 promise/awaitable 타입을 만들지 마세요.