Здравствуйте, barney, Вы писали:
...
B>про Context / Coroutines
B>вообще это интересно, вполне можно использовать
B>Технический практический вопрос:
B>Как именно сделать некий легковесный пул задач на корутинах?
B>Я так понимаю, корутины дают легковесное переключение "контекста" т.к оным там является переключение (сохранение/восстановление)
B>указателя инструкций + текущего стека + регистров.
B>И это эффективнее вызова планировщика ОС
B>Плюс, позволяет писать более "синхронный" код, как в лекции про яндекс.карты.
B>Интересно, как именно сделать "асинхронный фьючерс" и wait() — например, ожидание ввода-вывода, сети, результата работы другой корутины и т.д.
Эту ссылку уже приводили выше, там именно про асинхронный фьючерс, wait
rethinkdb-concurrency
Если пропрет поразбираться просто из спортивного интереса — могу показать еще такое:
управлятор пулом задач на корутинах
от него вниз:
собственно, корутина
движок контекстов от буста рядом есть еще posix-ucontext
и вверх:
ожидатор
пример объекта синхронизации 'событие' там рядом еще много других всяких
future
promise
их ядро
кишки устройства задачи
запуск задачи
некоторые примеры использования:
запуск задачи
синхронизация
future/promise
B>... ожидание ввода-вывода
файловый дескриптор (он же сокет)
ожидание событий на дескрипторах, epoll
Здравствуйте, barney, Вы писали:
...
B>про Context / Coroutines
B>вообще это интересно, вполне можно использовать
B>Технический практический вопрос:
B>Как именно сделать некий легковесный пул задач на корутинах?
B>Я так понимаю, корутины дают легковесное переключение "контекста" т.к оным там является переключение (сохранение/восстановление)
B>указателя инструкций + текущего стека + регистров.
B>И это эффективнее вызова планировщика ОС
B>Плюс, позволяет писать более "синхронный" код, как в лекции про яндекс.карты.
B>Интересно, как именно сделать "асинхронный фьючерс" и wait() — например, ожидание ввода-вывода, сети, результата работы другой корутины и т.д.
еще можно посмотреть
mordor
Здравствуйте, barney, Вы писали:
_>> Там сложности в основном у библиотек требующих всяческий специфичный системный API...
B>м... я думал, boost опирается только на c++ std / posix и с андроидом проблема именно в совместимости с NDK
B>(там, например нет стандартной C библиотеки, там bionic)
Ну во-первых там не только bionic, но есть и libc и libstdc++. Но дело как раз не в них. Наоборот, главной плюс Boost'а в том, что он абстрагирует многие платфомозависимые вещи, имея при этом внутри себя по специфической (оптимальной) реализации под каждую из платформ. Например какой-нибудь там asio под виндой работает через родной асинхронный интерфейс winapi. Ну так вот некоторые из таких платформозависимых библиотек Boost'а не имеют версий под Андроид.
B>про Context / Coroutines
B>вообще это интересно, вполне можно использовать
B>Технический практический вопрос:
B>Как именно сделать некий легковесный пул задач на корутинах?
Для реализации лёгких (их ещё часто называют зелёными) потоков сопрограммы не нужны. Для этого достаточно как раз переключателя контекстов. Сопрограммы — это нечто большее, что позволяет делать потоки с "несколькими входами".
B>Я так понимаю, корутины дают легковесное переключение "контекста" т.к оным там является переключение (сохранение/восстановление)
B>указателя инструкций + текущего стека + регистров.
B>И это эффективнее вызова планировщика ОС
Да, нормальное переключение системных потоков идёт через ядро ОС, что весьма тяжело. А такие лёгкие потоки потоки переключаются почти мгновенно, но у этого есть своя цена — у нас тут снова (как в первых версиях винды) получается кооперативная, а не вытесняющая многозадачность.
B>Плюс, позволяет писать более "синхронный" код, как в лекции про яндекс.карты.
Да, вот для написание асинхронного кода, выглядящего как синхронный, сопрограммы и нужны.
B>Интересно, как именно сделать "асинхронный фьючерс" и wait() — например, ожидание ввода-вывода, сети, результата работы другой корутины и т.д.
Ну вот например здесь
http://rsdn.org/forum/philosophy/5353890.1Автор: alex_public
Дата: 06.11.13
можно увидеть вариацию на тему. Правда там используется совсем старая версия бустовских сопрограмм (они с тех пор существенно изменились) и ключевая цель там чуть другая (обработка в UI потоке результатов неких асинхронных операций, каждая из которых представляют собой отдельные системные потоки, исполняющие синхронные операции).