Готовимся к С++20. Coroutines TS на реальном примере

В C++20 вот-вот появится возможность работать с корутинами из коробки. Нам в Яндекс.Такси эта тема близка и интересна (под собственные нужды мы разрабатываем асинхронный фреймворк). Поэтому сегодня мы на реальном примере покажем читателям Хабра, как можно работать с C++ stackless корутинами.

В качестве примера возьмём что-то простое: без работы с асинхронными сетевыми интерфейсами, асинхронными таймерами, состоящее из одной функции. Например, попробуем осознать и переписать вот такую «лапшу» из колбеков:

void FuncToDealWith() {
    InCurrentThread();

    writerQueue.PushTask([=]() {
        InWriterThread1();

        const auto finally = [=]() {
            InWriterThread2();
            ShutdownAll();
        };

        if (NeedNetwork()) {
            networkQueue.PushTask([=](){
                auto v = InNetworkThread();
                if (v) {
                    UIQueue.PushTask([=](){
                        InUIThread();
                        writerQueue.PushTask(finally);
                    });
                } else {
                    writerQueue.PushTask(finally);
                }
            });
        } else {
            finally();
        }
    });
}

Читать дальше →
Готовимся к С++20. Coroutines TS на реальном примере
Source: habrahabr