Odpověď na názor

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

  • 28. 4. 2025 14:28

    Ondřej Novák

    Jasně, no já jsem při psaní nechtěl kopírovat cppreference, kde to rozebírají a odkud pochází ta věta o "populated with local variables".

    Ale v C++ to fakt není složité, resp je to jednodušší, než je napsáno v dokumentaci, protože celá magie kolem korutin je věc překladače a uspořádání toho kódu, rozsekání na úseky mezi body přerušení.

    Takže ano, jakmile uděláš co_await <výraz>, tak <výraz> musí vrátit něco, co má ty tři funkce. První se udělá await_ready a pokud je true, tak se zavolá await_resume a to se vrátí jako výsledek. Pokud await_ready vrátí false, zavolá se await_suspend a pak se zpravidla dojde k instrukci RET (návrat k volajícímu). Nebo se tedy přepne někam jinam. A ten kdo drží handle (má ho přes await_suspend) zavolá resume, když už je to hotovo. V rámci resume se pak zavolá await_resume a výsledek té funkce se vrátí jako výsledek co_await a korutina pokračuje.

    Jo, je to jak kdyby to byl callback. Nic víc v tom není. Fakt hloupý callback - tady bacha, pokud ho člověk chce volat z přerušení nebo ze signal handleru, nedoporučuju, je lepší si event poznačit a vyzvednout ho v nějakém dispatcheru v hlavním vlákně. Tuhle jsem třeba v linuxu řešit co_await wait_for_break(), což opravdu čeká na SIGINT nebo SIGTERM. Musel jsem si přes eventfd poslat signal do hlavního vlákna a na ten to pak reagoval. Volat resume v signal handleru je sebevražda.