Odpověď na názor

Odpovídáte na názor ke článku Zamyšlení se nad korutinami v C++20.

  • 28. 4. 2025 13:02

    Ondřej Novák

    Ještě mě teď napadlo, že možná jsem to napsal zmateně

    co_await -> volá postupně tři metody await_ready, await_suspend, await_resume

    Pokud se ale nacházím v kódu, kde nemohu udělat co_await a nějaká funkce mi vrátí awaitera, pak mi nic nebrání tyto funkce volat ručně


    auto awt = stream.read();
    if (awt.await_ready()) {
        auto data = awt.await_resume();
        //....zpra­cování dat ...
    } else {
        awt.await_sus­pend( /* tady musím dodat něco, co implementuje resume */)
    }

    Z hlediska definice nejde o korutinu, ovšem z pohledu awaitera vůbec nemusí být poznat, jestli ten kdo ho ovládá je co_await, nebo mnou ručně napsaný kód.
    Často lze udělat to, speciálně, když mám async operaci, která v drtivém případě může skončit synchronně, tedy await_ready() je většinou true - například zápis do socketu - že tuto operaci volám v normální funkci s optimistickým předpokladem právě synchronního dokončení. Pak ovládam awaitera ručně. Ale pokud by náhodou await_ready() vrátil false, pak si musím vytvořit korutinu v uspaném stavu, a její handle dodat při ručním volání await_suspend() jako parametr. A async operace se pak dokončí v té korutině.

    Jde zpravidla o performance. Korutina se někde musí alokovat, ale synchronní operace alokaci nepotřebuje.