비동기 작업과 Awaiter 형식
사용자 지정 Awaiter 및 promise 형식으로 비동기 작업을 구성합니다.
비동기 작업과 Awaiter 형식은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
비동기 코루틴
비동기 작업은 입출력에서 일시 중단되었다가 작업이 완료되면 재개됩니다. co_await를 비동기 API와 결합하면 콜백 없이 비동기 코드를 작성할 수 있습니다.
Task 타입 개요
Task는 비동기 코루틴을 감쌉니다. 연결을 위해 co_await를 지원합니다.
template <typename T>
struct Task {
struct promise_type;
std::coroutine_handle<promise_type> handle;
// ...
};co_await 작동 방식
컴파일러가 co_await expr을 만나면 expr이 대기 가능 객체이기를 기대합니다. 대기 가능 객체에는 세 가지 메서드가 있습니다.
await_ready()— 일시 중단하려면 false를, 건너뛰려면 true를 반환합니다await_suspend(handle)— 일시 중단된 동안 수행할 작업을 지정합니다await_resume()— 호출하는 코드에 전달할 값을 지정합니다
대기 가능 객체 예: Sleep
지연 시간 후 재개를 예약하는 대기 가능 객체입니다.
struct Sleep {
std::chrono::milliseconds duration;
bool await_ready() const { return false; }
void await_suspend(std::coroutine_handle<> h) {
std::thread([h, this] {
std::this_thread::sleep_for(duration);
h.resume();
}).detach();
}
void await_resume() {}
};
Task<void> example() {
co_await Sleep{500ms};
std::cout << "after 500ms";
}HTTP용 대기 가능 객체
라이브러리는 HTTP 요청, 타이머, 파일 입출력용 대기 가능 객체를 제공합니다. 동기식 호출처럼 조합할 수 있습니다.
Task<std::string> fetch() {
auto data = co_await http_get("/api/data");
co_return data;
}작업 조합
한 작업을 다른 작업 안에서 기다리면 두 작업이 연결됩니다. 바깥 작업은 안쪽 작업이 끝날 때까지 일시 중단됩니다.
Task<int> outer() {
int x = co_await inner_a();
int y = co_await inner_b();
co_return x + y;
}병렬 작업
비동기 작업을 병렬로 수행하려면 각 작업을 즉시 기다리지 않고 시작한 다음, 모든 작업을 기다리십시오.
Task<int> sum_tasks() {
auto a = inner_a();
auto b = inner_b();
int x = co_await a;
int y = co_await b;
co_return x + y;
}예외 전파
비동기 작업 내부에서 발생한 예외는 promise 객체의 unhandled_exception에 저장한 후, 기다리는 쪽에서 다시 발생시킬 수 있습니다.
취소
표준 라이브러리는 아직 취소 기본 기능을 제공하지 않습니다. 라이브러리(cppcoro, boost.cobalt)는 대개 취소 토큰이나 중지 소스를 사용하여 자체 기능을 구현합니다.
Boost.Asio 통합
Asio는 코루틴을 기본적으로 지원합니다. async_read, async_write 및 이와 유사한 작업에 co_await를 사용할 수 있습니다. 현재 C++ 비동기 입출력을 구현하는 가장 깔끔한 방법입니다.
성능
코루틴 재개는 스레드 전환보다 훨씬 저렴합니다. 컴파일러는 상태 머신의 일부를 자주 인라인합니다. 대기 가능 객체 스택이 문제없이 컴파일되는지 프로파일링하여 확인하십시오.
향후 방향
C++23은 std::generator와 여러 개선 사항을 추가했습니다. C++26에서는 코루틴과 상호 운용되는 더 일반적인 비동기 프레임워크인 std::execution(송신자/수신자)이 도입될 수 있습니다.
간단히 확인하기
대기 가능 타입에 필요한 세 가지 메서드는 무엇입니까?
요약
비동기 작업은 co_await와 대기 가능 객체를 결합하여 콜백 없이 비동기 코드를 작성할 수 있게 합니다. 대기 가능 객체에는 await_ready, await_suspend, await_resume이 있습니다. 라이브러리(cppcoro, Asio)는 바로 사용할 수 있는 작업 및 대기 가능 타입을 제공합니다.
AI 튜터와 함께 C++을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 51
- 레슨
- 203
자주 묻는 질문
“비동기 작업과 Awaiter 형식” 강의는 무료인가요?
네 — “비동기 작업과 Awaiter 형식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“비동기 작업과 Awaiter 형식”에서 뭘 배우나요?
사용자 지정 Awaiter 및 promise 형식으로 비동기 작업을 구성합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“비동기 작업과 Awaiter 형식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 코루틴 개념: co_await, co_yield, co_return
- 간단한 생성기 구현
- 비동기 작업과 Awaiter 형식
- 코루틴 프레임 할당