Coroutine nedir?
- C++ kursu
- İleri seviye
- Ders 67/83
- 5 dk
C++20 coroutine kavramını öğrenirsin.
Coroutine nedir?
Bir coroutine, askıya alınabilen (suspend) ve devam ettirilebilen (resume) bir fonksiyondur. C++20 ile standart kütüphaneye girdi. Normal bir fonksiyon baştan sona kadar çalışır; coroutine ise ara noktalarda durup dışarıdan devam ettirilebilir.
Üç anahtar sözcük coroutine tanımlar: co_await (bekleme noktası), co_yield (değer üretme) ve co_return (bitirme). Bir fonksiyon bunlardan birini kullanırsa, otomatik olarak coroutine olur. Coroutine'ler asenkron işlemleri, üreteçleri (generator) ve state makinelerini sade biçimde yazmamızı sağlar.
Suspend ve resume
Coroutines, çağrıldığında bir coroutine frame (çerçeve) oluşturur. Bu çerçeve, yerel değişkenleri ve durumu yığında (heap) saklar. Fonksiyon askıya alındığında çerçeve kalır; devam ettirildiğinde aynı durundan sürdürülür.
Bir coroutine'in dönüş türü, promise_type içeren bir tür olmalıdır. Bu tür, coroutine'in nasıl başlayacağını, sonlanacağını ve değer nasıl döndüreceğini tanımlar. std::coroutine_handle ile coroutine'i elle devam ettirir veya yok edersin. Bu mekanizma, asenkron akışları tip-güvenli biçimde yönetir.
Uygulama co_return ile değer döndür
make_value coroutine'inin gövdesine co_return 42; yaz. main içinde make_value() çağrısının sonucundan promise().value_ ile değeri al ve std::cout ile yaz.
Başlangıç kodu
#include <iostream>
#include <coroutine>
struct Returner {
struct promise_type {
int value_;
Returner 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_value(int v) { value_ = v; }
void unhandled_exception() { }
};
std::coroutine_handle<promise_type> handle;
};
Returner make_value() {
// co_return ile 42 döndür
}
int main() {
// make_value çağır ve değeri yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <coroutine>
struct Returner {
struct promise_type {
int value_;
Returner 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_value(int v) { value_ = v; }
void unhandled_exception() { }
};
std::coroutine_handle<promise_type> handle;
};
Returner make_value() {
co_return 42;
}
int main() {
auto r = make_value();
std::cout << r.handle.promise().value_;
return 0;
}Beklenen çıktı
42
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Coroutine ile normal fonksiyon arasındaki fark nedir?
- Coroutine daha hızlı çalışır
- Coroutine yalnızca sınıf içinde tanımlanır
- Coroutine askıya alınabilir ve devam ettirilebilir Doğru cevap
- Coroutine parametre almaz
Açıklama: Coroutine, askıya alınabilen ve devam ettirilebilen bir fonksiyondur.
2 Coroutine anahtar sözcüğü
Task run() { ____ 42; }
Task run() { co_return 42; }
Açıklama: co_return, coroutine'i bitirir ve değer döndürür.
3 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
co_await |
Bekleme noktası |
co_yield |
Değer üretme |
co_return |
Bitirme |
promise_type |
Davranış sözleşmesi |