CodeBlanks Logo Icon CodeBlanks

co_await

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

main.cpp
#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

main.cpp
#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ı

Soru
int v = ____ Awaiter{};
Cevap
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.

İleri seviye bölümündeki tüm dersler