Özet - Coroutines
- C++ kursu
- İleri seviye
- Ders 72/83
- 5 dk
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
#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
#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ı
auto g = ____();
auto g = counter();
Açıklama: counter, üreteç coroutine'ini başlatır.