본문 바로가기

진리는어디에/C++

[C++20] 코루틴(Coroutine) - co_return

코루틴을 종료하기 위해선 co_return을 호출한다.

Task foo() {
    co_return;
}

co_return은 값을 리턴 할 수도 있고, 아무런 값도 리턴하지 않고 단순히 코루틴을 종료하기만 할수도 있다. 값을 리턴하느냐 그렇지 않느냐에 따라 코루틴 함수의 리턴 타입이 가져야 하는 요구사항이 달라진다. 코루틴의 리턴 타입에 어떠한 것들이 필요한지 아래 예제를 통해 알아 보도록 한다.

컴파일러는 co_return 키워드를 만나면 아래와 비슷한 코드를 생성한다.

Task foo()
{
   promise.return_void();
   co_await promise.final_suspend();
}

컴파일러는 co_return 대신에 promise와 co_await를 생성한다. foo() 함수는 아무것도 리턴하지 않으므로 코루틴을 종료하기 전에 return_void()를 호출 한다. 만일 아래와 같이 값을 리턴하는 코루틴이라면 

Task<int> foo() {
    co_return 7;
}

promise의 return_vaule() 함수를 대신 호출 한다.

Task<int> foo()
{
   promise.return_value(7);
   co_await promise.final_suspend();
}

참고로 한 promise 타입에 이 두 함수는 동시에 구현 될수 없다. 값을 리턴하던지, 그렇지 않던지 둘중에 하나만 택해야 한다.

결론은 co_return을 사용하기 위해서는 리턴 값을 유무에 따라 promise_type에 void return_void() 또는 void return_value(Type value) 를 추가해 주어야 한다.

 

코루틴이 co_return 에 도달하면 다음과 같이 처리 된다

  • co_return을 만나면 스택에 생성 되었던 모든 변수들이 생성 반대 순서로 해제 된다.
  • promise.return_value(exprt) 이나 promise.return_void() 후에 co_await promise.final_suspend() 가 호출 된다
    NOTE - final_suspend()가 호출 된다는 것은 코루틴의 완전 종료를 의미하고 final_suspend() 호출 이후 코루틴 객체의 done()함수를 호출하면 true가 리턴 된다.
유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!