Hlavní navigace

Názor ke článku C++20: Jak se budí korutiny od Králík - Jako člověk, co pracuje s producenty typu "burzovní...

  • 4. 11. 2022 10:56

    Králík

    Jako člověk, co pracuje s producenty typu "burzovní informace" nejsem s řešením pozastavení producenta moc spokojen
    Samozřejmě, existují producery, kde je kritické, aby produkovaly. Ale i v takovém případě bude nejspíše zastavení producera frontou menší katastrofa než bad_allocy vyskakující na X různých místech v kódu nebo si nechat sestřelit OOM killerem celý proces... Pokud dojde paměť, ten producer stejně tak jako tak nemůže pokračovat (nemá kam dávat výsledky)... Samozřejmě záleží na konkrétní situaci, reálně bude možná spíš řešením použít kafku nebo tak něco... Ale to už bychom se dostali někam úplně jinam...

    Go mimochodem hodí výjimku, vyzkoušeno (nebo možná chybu, nezkoušel jsem, jestli se dá zachytit)
    Výjimku Go opravdu nevyhodí. Možná ti to z nějakého důvodu panikuje, což může vypadat jako výjimka (a je to i implementováno podobně, ale <i>není</i> to mechanismus oštření chyb, spíš něco jako assert). Pokud ti to panikovalo, možná ses pokoušel zapisovat do zavřeného kanálu. Jinak zápis do plného kanálu by opravdu měl pozastavit korutinu, případně je možné se dotázat kanálu, jestli je možné aktuálně zapisovat (nevzpomínám si na syntaxi, ale jde to).

    Zastavování producera může vést k deadlocku.
    To je velmi obecný argument, v MT/multitask programování může vést k deadlocku leccos. S korutinami si můžeš uhnat deadlock i na jednom vláknu, a to dokonce i v tom Rustu (kde kompilátor umí eliminovat race-conditions, ale deadlocky ne). Prostě je potřeba si dát na deadlocky pozor obecně :-)

    mimochodem by to znamenalo další frontu čekajících korutin, další signalizační mechanismus
    Jistě. Což ale není žádná katastrofa. Různé implementace to řeší různě. V Rust Tokio frameworku jsou k dispozici dva různé typy kanálů (V C++ by se řeklo třídy, rust nemá třídy), zastropovaný a nezastropovaný. Anebo je možné to implementovat v jednom a mít třeba dva různé konstruktory a v tom bez stropu prostě nenaalokovat frontu tasků na vstupu. To už jsou implementační detaily...