코루틴이란?
이 글에서는 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 변수:
i와state가 정적(static)으로 선언되어 있기 때문에, 함수가 반환된 후에도 값이 유지됩니다. 덕분에 다음 호출 시 이전 상태를 그대로 이어받을 수 있습니다. - switch 문을 활용한 재개 지점:
case 1:이for반복문 내부에 배치되어 있습니다. 첫 호출 시에는case 0부터 시작하지만, 이후 호출에서는state값이 1이므로 반복문 안의case 1로 바로 점프하여 중단되었던 반복문의 다음 단계부터 실행이 재개됩니다. - 종료 조건:
i가b에 도달하면 반복문이 끝나고,state를 초기화한 뒤 0을 반환하여 호출자에게 반복 종료를 알립니다.
결과적으로 main 함수와 range 함수는 서로 제어권을 주고받으며 마치 하나의 흐름처럼 협력적으로 동작하는데, 이것이 바로 코루틴의 기본적인 동작 방식입니다. 참고로 최신 C++20부터는 co_await, co_yield, co_return 키워드를 통해 코루틴을 언어 차원에서 공식적으로 지원하고 있습니다.