CodeBlanks Logo Icon CodeBlanks

Özet - Coroutines

co_await, co_yield ve Task'ı birleştirerek bir asenkron sayaç yazarsın.

Özet - Coroutines

Bu grupta coroutine, co_await, co_return, co_yield ve Task type'ı öğrendin.

Coroutine, askıya alınabilen ve devam ettirilebilen bir fonksiyondur. co_await bir bekleme noktası oluşturur; co_return değer döndürerek bitirir; co_yield değer üretip duraklatır. Task type, promise_type ile coroutine'in davranışını tanımlar. Şimdi bu dördü birleştiren bir async counter yazacaksın: co_yield ile değer üretecek ve generator çerçevesi içinde çalışacak.

Uygulama Async counter yaz

counter coroutine'inin gövdesine co_yield 5; ve co_yield 6; yaz. main içindeki resume ve std::cout çağrıları hazırdır; dokunma.

Başlangıç kodu

main.cpp
#include <iostream>
#include <coroutine>

struct Generator {
    struct promise_type {
        int value_;
        Generator get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        std::suspend_always yield_value(int v) { value_ = v; return {}; }
        void return_void() { }
        void unhandled_exception() { }
    };
    std::coroutine_handle<promise_type> handle;
};

Generator counter() {
    // co_yield ile 5 ve 6 üret
}

int main() {
    auto g = counter();
    g.handle.resume();
    std::cout << g.handle.promise().value_;
    g.handle.resume();
    std::cout << g.handle.promise().value_;
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <coroutine>

struct Generator {
    struct promise_type {
        int value_;
        Generator get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        std::suspend_always yield_value(int v) { value_ = v; return {}; }
        void return_void() { }
        void unhandled_exception() { }
    };
    std::coroutine_handle<promise_type> handle;
};

Generator counter() {
    co_yield 5;
    co_yield 6;
}

int main() {
    auto g = counter();
    g.handle.resume();
    std::cout << g.handle.promise().value_;
    g.handle.resume();
    std::cout << g.handle.promise().value_;
    return 0;
}

Beklenen çıktı

56

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Kavramı açıklamasıyla eşle

Kavram Anlamı
coroutine Askıya alınabilen fonksiyon
co_await Bekleme noktası
co_yield Değer üretme
co_return Değerli bitirme

2 Hangi anahtar sözcük değer üretip coroutine'i duraklatır?

  • co_await
  • co_return
  • return
  • co_yield Doğru cevap

Açıklama: co_yield, değer üretip coroutine'i askıya alır.

3 counter çağrısı

Soru
auto g = ____();
Cevap
auto g = counter();

Açıklama: counter, üreteç coroutine'ini başlatır.

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