Odpovídáte na názor ke článku Zamyšlení se nad korutinami v C++20.
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();
//....zpracování dat ...
} else {
awt.await_suspend( /* 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.
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 57 601×
Přečteno 27 720×
Přečteno 26 403×
Přečteno 24 367×
Přečteno 22 864×