Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 코루틴(Coroutine) 개념과 구현 예제

코루틴이란?

이 글에서는 C/C++에서 코루틴(Coroutine)이 무엇인지, 그리고 이를 실제 코드로 어떻게 구현하는지 알아보겠습니다.

코루틴은 두 개의 루틴(함수) 사이에서 실행 제어권을 서로 주고받으면서 번갈아 수행되는 제어 구조입니다. 일반적인 함수 호출과 달리, 코루틴은 호출된 함수가 완전히 종료되지 않은 상태에서 제어권을 넘기고, 나중에 중단된 지점부터 다시 실행을 재개할 수 있다는 점이 특징입니다.

예제 코드

다음 예제는 C 언어에서 static 변수와 switch 문을 활용하여 코루틴의 동작을 흉내 낸 코드입니다.

#include<stdio.h>
int range(int a, int b){
   static long long int i;
   static int state = 0;
   switch (state){
   case 0:
      state = 1;
      for (i = a; i < b; i++){
         return i;
    // 제어권 반환
      case 1:; // 제어권 재개
      }
   }
   state = 0;
   return 0;
}
int main(){
   int i;
   for (; i=range(1, 5);)
      printf("control at main :%d\n", i);
   return 0;
}

실행 결과

control at main :1
control at main :2
control at main :3
control at main :4

코드 동작 원리

이 코드가 코루틴처럼 동작하는 핵심 요소는 다음과 같습니다.

  • static 변수: istate가 정적(static)으로 선언되어 있기 때문에, 함수가 반환된 후에도 값이 유지됩니다. 덕분에 다음 호출 시 이전 상태를 그대로 이어받을 수 있습니다.
  • switch 문을 활용한 재개 지점: case 1:for 반복문 내부에 배치되어 있습니다. 첫 호출 시에는 case 0부터 시작하지만, 이후 호출에서는 state 값이 1이므로 반복문 안의 case 1로 바로 점프하여 중단되었던 반복문의 다음 단계부터 실행이 재개됩니다.
  • 종료 조건: ib에 도달하면 반복문이 끝나고, state를 초기화한 뒤 0을 반환하여 호출자에게 반복 종료를 알립니다.

결과적으로 main 함수와 range 함수는 서로 제어권을 주고받으며 마치 하나의 흐름처럼 협력적으로 동작하는데, 이것이 바로 코루틴의 기본적인 동작 방식입니다. 참고로 최신 C++20부터는 co_await, co_yield, co_return 키워드를 통해 코루틴을 언어 차원에서 공식적으로 지원하고 있습니다.