CodeBlanks Logo Icon CodeBlanks

Task type

Task ve promise type öğrenirsin.

Task ve promise type

Bir Task türü, coroutine'in dönüş türüdür ve içinde bir promise_type içerir. promise_type, coroutine'in başlama, bitirme ve değer döndürme davranışını tanımlar.

Bir promise_type'ın zorunlu üyeleri şunlardır: get_return_object (Task nesnesini üretir), initial_suspend (başlangıçta askıya alma), final_suspend (bitişte askıya alma), return_void veya return_value (bitirme) ve unhandled_exception (hata). Bu üyeler, coroutine'in iskeletini oluşturur. Eksik olursa derleme hatası alırsın.

Askıya alma üyeleri

initial_suspend ve final_suspend, coroutine'in başında ve sonunda ne olduğunu belirler. std::suspend_never dönerse coroutine hemen çalışır; std::suspend_always dönerse askıya alınır.

Bir Task çoğunlukla initial_suspend için suspend_never (hemen başla) ve final_suspend için suspend_always (çerçeveyi yaşat) kullanır. Böylece coroutine başlar, değer üretir ve bittiğinde çerçeve kalır; dışarıdan okunabilir. noexcept ile de işaretlenirler çünkü final_suspend istisna fırlatmamalıdır.

Uygulama Task promise_type tamamla

promise_type içine std::suspend_never initial_suspend() { return {}; } ve std::suspend_never final_suspend() noexcept { return {}; } üyelerini ekle. main içindeki kod hazırdır; dokunma.

Başlangıç kodu

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

struct Task {
    struct promise_type {
        Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
        // initial_suspend ve final_suspend ekle
        void return_void() { }
        void unhandled_exception() { }
    };
    std::coroutine_handle<promise_type> handle;
};

Task run() {
    co_return;
}

int main() {
    run();
    std::cout << "Task testi geçti";
    return 0;
}

Örnek çözüm

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

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_never final_suspend() noexcept { return {}; }
        void return_void() { }
        void unhandled_exception() { }
    };
    std::coroutine_handle<promise_type> handle;
};

Task run() {
    co_return;
}

int main() {
    run();
    std::cout << "Task testi geçti";
    return 0;
}

Beklenen çıktı

Task testi geçti

Soru ve cevaplar

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

1 promise_type üyesi

Soru
struct promise_type { Task ____() { return {}; } };
Cevap
struct promise_type { Task get_return_object() { return {}; } };

Açıklama: get_return_object, Task nesnesini promise'tan üretir.

2 promise_type ne yapar?

  • Coroutine'in hızını artırır
  • Coroutine'i siler
  • Coroutine'in başlama, bitirme ve değer döndürme davranışını tanımlar Doğru cevap
  • Coroutine'in parametrelerini sayar

Açıklama: promise_type, coroutine'in davranış sözleşmesini tanımlar.

3 Üyeyi rolüne eşle

Kavram Anlamı
get_return_object Task nesnesini üretir
initial_suspend Başlangıç askısı
final_suspend Bitiş askısı
unhandled_exception Hata yakalama

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