강좌

C++ 코루틴(coroutine) 활용 강좌: #1 시작하며 그리고 기본 개념

하늘흐늘 2022. 5. 19. 15:45
반응형

코루틴이라는 것이 개념적으로는 쉬운 내용이고 C#과 같은 다른 언어에서는 언어의 기본 구현에 포함되어 간편하게 사용할 수 있습니다. 하지만 C++은 늦게 C++ 20 표준에 포함되었고 구현이 조금은 투박하게 느껴지는 관계로 사용하는게 쉽지는 않습니다. 이런 이유로 코루틴의 활용보다는 코루틴 사용을 위한 기반 내용에 초점이 맞추어져 있는 기존 글들과는 달리 활용에 맞추어 강좌를 만들었습니다.

이 강좌 시리즈에서는 표준에 맞게 C++로 구현한 코루틴 관련 상태 객체 소스를 바탕으로 실제로 코루틴을 사용하는 활용 예제를 살펴보도록 하겠습니다. C++ 표준에서 코루틴을 사용하기 위하여 직접 구현해야 하는 것 중 하나가 코루틴 관련 상태 객체인데 이 부분은 예제 소스로 제공하도록 하겠습니다. 실제로 자신의 프로젝트에서 사용하실 때에는 해당 소스를 사용하거나 필요한 만큼 수정하셔서 사용하시면 됩니다. 

코루틴의 개념

코루틴이라는 것을 설명하는 가장 좋은 예제는 일반적인 경우의 함수의 실행과 비교해 보는 것입니다. 함수 호출시 함수의 실행은 함수의 시작에서 부터 return문을 만나거나 함수가 끝날 때까지 진행됩니다. 함수의 실행 중간에 제어를 다른 함수로 변경할 수 없습니다. 코루틴이라는 것은 함수의 실행이 중간에 코루틴 관련 제어점을 만나 함수의 실행 중간에 멈추고 다른 함수로 실행 제어권을 넘길 수 있습니다. 또한 중간에 멈추어진 함수는 다시 제어권을 얻게되었을 때 멈춘 지점에서 부터 계속 실행을 지속할 수 있습니다. 이렇게 함수의 중간에 실행을 멈추고 제어권을 얻었을 때 재게할 수 있다는 것이 코루틴이 기존 함수의 실행과 틀린 점입니다.

코루틴의 장점
코루틴이라는 개념도 쓰레드나 병렬 처리처럼 동시성 처리를 하는 하나의 방법입니다. 이 코루틴은 아래와 같은 장점을 가집니다.

1. 공유 자원에 대해서 동기화 관련 문제가 발생하지 않습니다.
코루틴은 실행하는 쓰레드 내에서 서로 제어권이 변경되는 개념이기 때문에 코루틴 관련 여러 함수들이 동시에 실행되는 것처럼 보이지만 멀티 쓰레드처럼 동시에 실행되는 것은 아닌 관계로 동기화 관련 문제가 발생하지 않습니다. 이런 이유로 동시성 처리를 하지만 디버깅이 멀티 쓰레드에 비하여 쉽습니다.

2. 쓰레드와 비교하여 적은 비용으로 처리 됩니다.
쓰레드의 생성과 삭제 그리고 컨텍스트 스위칭 비용에 비하여 적은 비용이 발생하여 성능 상에 좋습니다. 물론 I/O처리와 같이 동시적으로 처리해야 하는 경우에는 쓰레드가 더 성능이 좋겠지만 그런 경우가 아니라면 한 쓰레드에서 여러 개의 코루틴이 돌아가는 관계로 더 적은 성능 상의 비용으로 동시성 처리를 할 수 있습니다.

C++ coroutine
이 강좌 시리즈는 최소한의 C++ 코루틴 관련 기반 지식으로 활용하는 예를 보여주는 것을 목표로 하였습니다. 하지만 실제로 제공된 코루틴 상태 관련 객체를 수정하거나 코루틴 사용을 위한 기반 지식을 얻기를 원하시는 분들은 아래 글들을 추천합니다.

Coroutines (C++20)
C++에서 코루틴을 사용하기 위한 기반 기술적 지식을 이해하기 좋습니다. 나와있는 예제는 VS 2019에서 컴파일이 되지 않아 개인적으로는 예제를 실행해 보지는 않고 참조만 하였습니다. 

My tutorial and take on C++20 coroutines
C++에서 코루틴을 사용하기 위해서 기반 지식과 코드의 예를 단계적으로 설명하여 주는 최고의 글입니다. 저와 같은 경우 다른 글에서는 C++ 코루틴 사용법이 잘 이해가 되지 않았는데 이 글의 예제를 따라하며 C++ 코루틴 사용법을 확실히 이해할 수 있었습니다.
단지 예제를 컴파일 하면 VS 2019에서 컴파일하면 아래와 비슷한 에러가 나온다는 아쉬움이 있습니다.

error C3781: ReturnObject2::promise_type: 코루틴의 프라미스에서 'return_value' 또는 'return_void' 중 하나를 선언해야 합니다.

이런 경우 a coroutine's promise must declare either 'return_value' or 'return_void'" Error Visual Studio 2019 C++ 20에 나와 있는 것처럼 struct promise_type 클래스에 아래 코드를 추가시켜 주면 문제가 해결됩니다.

void return_void() noexcept {}

 

반응형