co_await
- C++ kursu
- İleri seviye
- Ders 68/83
- 5 dk
co_await ile bekleme noktasını öğrenirsin.
co_await ne yapar?
co_await, bir coroutine içinde bir bekleme noktası oluşturur. Beklenen nesne (awaitable), hazır olana kadar coroutine askıya alınır; hazır olunca devam eder.
Bir awaitable türünün üç üyesi olmalıdır: await_ready (hazır mı?), await_suspend (nasıl askıya alınır?) ve await_resume (devam eden değer). Örnek: int v = co_await Awaiter{};. Burada Awaiter bir awaitable'dır; await_resume ile döndürdüğü değer v'ye atanır. Bu sayede asenkron akış, senkron görünüşlü kodla yazılır.
Awaitable type
Bir awaitable, await_ready, await_suspend ve await_resume üyelerine sahip bir türdür. En basit hâliyle hazır olan bir awaitable şöyledir:
struct Awaiter { bool await_ready() { return true; } void await_suspend(std::coroutine_handle<>) { } int await_resume() { return 7; } };. Burada await_ready true döndüğü için coroutine askıya alınmaz; await_resume 7 döndürür. co_await Awaiter{} ifadesi 7 değerini verir. Bu yapı, asenkron bir işlemin sonuçunu temsil eder.
Uygulama co_await ile değer al
run coroutine'inin gövdesine int v = co_await Awaiter{}; yaz ve std::cout << v; ile değeri yazdır. main içinde run(); çağrısını yap.
Başlangıç kodu
#include <iostream>
#include <coroutine>
struct Awaiter {
bool await_ready() { return true; }
void await_suspend(std::coroutine_handle<>) { }
int await_resume() { return 7; }
};
struct Task {
struct promise_type {
Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() { }
void unhandled_exception() { }
};
std::coroutine_handle<promise_type> handle;
};
Task run() {
// co_await ile Awaiter'ı bekle ve sonuçu yazdır
}
int main() {
// run çağrısı yap
return 0;
}Örnek çözüm
#include <iostream>
#include <coroutine>
struct Awaiter {
bool await_ready() { return true; }
void await_suspend(std::coroutine_handle<>) { }
int await_resume() { return 7; }
};
struct Task {
struct promise_type {
Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() { }
void unhandled_exception() { }
};
std::coroutine_handle<promise_type> handle;
};
Task run() {
int v = co_await Awaiter{};
std::cout << v;
}
int main() {
run();
return 0;
}Beklenen çıktı
7
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 co_await kullanımı
int v = ____ Awaiter{};
int v = co_await Awaiter{};
Açıklama: co_await, Awaiter'ı bekler ve sonuçu v'ye atar.
2 Üyeyi rolüne eşle
| Kavram | Anlamı |
|---|---|
await_ready |
Hazır mı? |
await_suspend |
Askıya alma |
await_resume |
Devam değeri |
co_await |
Bekleme ifadesi |
3 co_await Awaiter{} ne döndürür?
- Awaiter struct'ının kendisini
- Bir coroutine handle döndürür
- Hiçbir şey döndürmez
- await_resume üyesinin döndürdüğü değeri Doğru cevap
Açıklama: co_await, awaitable'ın await_resume üyesinin döndürdüğü değeri verir.