본문 바로가기

반응형

Coroutine

(7)
[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() 함수는 아무것도 리..
[C++20] 코루틴(Coroutine) - 예제 Coroutine.h #ifndef _COROUTINE_H_ #define _COROUTINE_H_ #include #include template class Coroutine { private: class Impl; struct promise_base { INITIAL_SUSPEND initial_suspend() { return INITIAL_SUSPEND{}; } std::suspend_always final_suspend() noexcept { return {}; } void unhandled_exception() { throw std::exception("unhandled exception"); } }; template struct promise_type_impl : public promise_..
[C++20] 코루틴(Coroutine) - co_yield 이번 강의는 [C++20] 코루틴(Coroutine)에 이어지는 내용 입니다. 이번 강의를 읽으시기 전에 이전 포스팅을 먼저 읽어 보시길 추천 드립니다. co_yield 코루틴을 중단(suspend)하고 호출자에게 돌아갈 때, 호출자에게 값을 넘기고 싶다면 co_await대신 co_yield를 사용 하면 됩니다. Generator foo() { //co_await std::suspend_always{}; co_yield 10; } 하지만 컴파일러는 'co_yield' 구문을 만나면 내부적으로 다음과 같은 코드를 생성합니다. Generator foo() { Generator::promise_type promise; // ...코드 생략... // co_yield 10; co_await promise.yie..
[C++20] 코루틴(Coroutine) - co_await 안녕하세요. 저번 시간의 [진리는어디에] - [C++20] 코루틴(Coroutine)에서는 C++20에서 새로이 도입된 코루틴의 기본에 대해 알아 보았습니다. 이 포스팅은 지난 과정에 이어지는 내용이므로 저번 포스팅을 한번 살펴 보시고 오시는 것이 이번 포스팅을 이해하는데 좀 더 도움이 되리라 생각합니다. 이번 포스팅에서는 지난 시간에 이어 co_await 키워드에 대해 살펴 보는 시간을 갖도록 하겠습니다. co_await expr co_await는 단항 연산자로써, 코루틴의 실행을 중단(suspend)하고 호출자(caller)에게 제어권을 넘기는데 사용 됩니다. co_await의 피연산자(expr)는 co_await operator를 구현했거나 현제 코루틴의 Promise::await_trasnform..
[C++20] 코루틴(Coroutine) 1958년 멜빈 콘웨이에 의해 처음으로 개념이 만들어 졌으며 이미 많은 현대 프로그래밍 언어들에서 지원하고 있지만 C++에만 없던 코루틴이 C++20 부터 드디어 지원됩니다. 코루틴이 지원되는 것은 너무도 반갑고 만세를 불러야 하는 일인데, 역시 C++은 C++이었습니다. 유구한 역사와 전통을 자랑하는 '자유를 주는 대신 책임도 니가 져라'라는 C++의 정신 답게 코루틴 활용 방법에 자유를 준 대신, 편리한 사용성을 가져갔습니다. 덤으로 제대로 사용하지 못하는 경우의 책임도 사용자가 져야 합니다. 만일 C#과 파이썬, 자바스크립트와 같은 다른 언어의 코루틴 경험이 있으신 분이라면 무슨 코루틴 한번 쓰기가 이렇게 어렵냐고 생각하실지도 모르겠습니다. 하지만 이 글을 끝까지 읽어 보시면 C++코루틴도 나름 익..
boost::asio::spawn이 하는 일은 뭔가요? spawn의 전체적인 과정이 머리속에서 안그려짐. 1. spawn(io_service, my_coroutine)을 호출 했을 때, my_coroutine을 감싸고 있는 새로운 핸들러가 io_service 큐에 추가 되는건가? -> spawn이 호출 될 때, Boost.Asio는 몇몇 셋팅 작업을 거친 후 사용자가 제공한 엔트리 포인트로써의 함수를 사용하는 코루틴을 생성하는 내부 핸들러를 dispatch() 하기 위해 strand를 사용하게 된다. 이런 조건에서, 내부 핸들러는 spawn 내에서 호출 가능하다. 그리고 다른 때는 지연된 호출을 위해 io_service에 post 된다. 2. 코루틴 안에서 인자로 넘어온 yield_context를 호출 했을 때, async operation이 완료 될때 까지..
[Unity] Coroutine 코루틴(Coroutine) 이해하기 http://unityindepth.tistory.com/21 https://en.wikipedia.org/wiki/Coroutine

반응형