728x90

이번 C++ 20에서 가장 기대했던 기능이라서 책도보고 인터넷 검색도 계속하면서 공부를 해본 결과 현재로썬 쉽게 사용하기는 힘들 것 같다...

회사 프로젝트에 적용하기에는 위험 부담이 있다... (디버깅이 너무 힘들 것 같다...)

아마도 코루틴을 이용하는 디자인 패턴이 좀 나오면서 정리가 되면 그때 사용하게 되지 않을까...? 하는 생각이 들 정도이다.

 

유니티를 하면서 코루틴이라는 개념을 처음 접했었는데 개념 자체는 크게 다르진 않은 것 같다.

코루틴의 개념은 이 포스팅에서 잘 설명을 해주고 있다.

(https://m.post.naver.com/viewer/postView.naver?volumeNo=33676443&memberNo=559061)

 

C++20 멀티쓰레드 서버에 코루틴 얹기

[BY MastProgs] C++20 에 추가된 코루틴으로 더 쩔게 코딩할 수 있어졌다< 결론부터 말하기 > C++20의...

m.post.naver.com

 

하지만 사용하기 위해서 준비를 많이 해야되는 부분은 불편해보인다.

 

다른 언어와 달리 C++은 기본적으로 Framework이 존재하지 않는다.

항상 사용자가 만들어서 사용을하든, 다른 라이브러리를 사용하든 어쨋든 간에 별도의 Framework을 생성해야만 한다.

그래서 이러한 준비(약속)가 필요하다.

 

가장 기본적으로 필요한 것은 promise_type이다.

struct promise_type
{
    // 코루틴의 객체를 반환한다.
    CoroutineObject get_return_object() { return {}; }
    
    // 코루틴이 실행 전에 멈춰있어야하는지 확인
    std::suspend_never initial_suspend() const noexcept { return {}; }
    
    // 코루틴이 종료 전에 멈춰있어야하는지 확인
    std::suspend_never final_suspend() const noexcept { return {}; }
    
    // co_return에 의해 호출 (코루틴이 무한 루프로 종료되지 않는다면 불필요)
    void return_void() { }
    
    // co_return val에 의해 호출됨
    void return_value(T value) { *_ptr = value; }
    
    // co_yield에 의해 호출
    std::suspend_always yield_value(const T value) { _value = value; return {}; }
    
    // 예외 발생
    void unhandled_exception() { }
};

 

C++에서의 코루틴 promise_type이라는 객체를 만들어서 커스터마이징을 해야되고, 이것을 이용해서 우리가 아는 코루틴의 개념에 맞게 직접 구현해야한다.

 

구현 내용이 너무 길기 때문에 그냥 다른 포스팅으로 대체한다.

https://openmynotepad.tistory.com/65

 

C++20) Coroutine ( 코루틴 ) - 1

프로그램이 실행될 때 불려지도록 만들어진 프로그램의 중심이 되는 코드들을 Main Routine 이라고 하며, Main Routine 이외에 다른 Routine을 모두 SubRoutine 이라고 한다. 그리고 진입 지점을 여러 개 가

openmynotepad.tistory.com

https://openmynotepad.tistory.com/66

 

C++20) Coroutine ( 코루틴 ) - 2

Coroutine 상태가 할당되면, 해당 할당이 힙에서 발생할 수도 있습니다. ( 힙에 발생해야한다고 생각해야하지만, 컴파일러가 최적화 할 수도 있습니다. ) 만약 힙에서 발생하고, 우리가 만든 promise_t

openmynotepad.tistory.com

https://openmynotepad.tistory.com/67

 

C++20) Coroutine ( 코루틴 ) - 3

co_yield 사용하기 co_yield는 Coroutine의 유용한 키워드이며 일부 값을 반환하지만, 코루틴을 종료시키지 않을 때 사용됩니다. 일반적인 사용 방법은 "특정 유형의 Generator ( 또는 발생기 )"를 생성할

openmynotepad.tistory.com

 

728x90

'Basic Programming > C++ 20' 카테고리의 다른 글

C++20 - 지정된 초기화 (Designated Initialization)  (1) 2023.12.17
C++20 - 삼항 비교 연산자(Three-Way Comparison)  (0) 2023.12.17
C++20 - Ranges  (0) 2023.12.10
C++20 - Module  (0) 2023.12.10
C++20 - Concepts  (0) 2023.12.10

+ Recent posts