Re[20]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 22:18
Оценка: 5 (1) +1
Здравствуйте, Mazay, Вы писали:

I>>>>По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться

FR>>>Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.
I>>Очевидно — нет.
M>А что у него вместо "stack switching model"?

Boost.Coroutine это stackful coroutines.

C#-ый async/await это фактически stackless coroutine.
Компилятор автоматически генерирует класс-конечный автомат. Локальные переменные оригинальной функции переносятся в поля этого класса, а весь код в метод класса который в зависимости от текущего state прыгает по switch на нужный await.

В C++ stackless coroutine реализуется 100-ми строчками, например как в Boost.Asio. Локальные переменные(если таковые имеются) переместить в поля класса нужно вручную, а в остальном всё схоже по форме и содержанию — например конечный автомат (с таким же switch'ем внутри) генерируется автоматически.

Stackless coroutine менее мощные чем stackful — если бы это было не так, то как минимум никто бы не реализовывал Boost.Coroutine.
Одна из фишек stackful coroutine в том, что можно инкапсулировать всю асинхронную логику во внутрь компонентов — так, что клиентский код будет выглядеть как синхронный — без всяких keywords и дополнительных вызовов.
Например, в examples к Boost.Coroutine есть пример простого сервера, который асинхронно считывает сообщения из tcp порта и выводит их на экран — причём всё это происходит в одном потоке. Цикл считывания выглядит точно также как и обыкновенный синхронный код:
do
{
    getline(client_stream, msg);
    cout << msg << endl; 
} while(msg != "exit");

Вся асинхронная логика спрятана в клиентский поток: внутри, после async_read_some делается yield, а когда придут данные — сопроцедура будится соответствующим хэндлером.
На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.