понедельник, 17 февраля 2014 г.

Московская встреча пользователей Си++ - часть 2

Место встречи

Сергей Платонов организовал московскую встречу Си++ разработчиков в конференц зале московской гостиницы Бородино, в районе Красносельского. Анонс группы и предварительная регистрация происходила посредством служб Google+, т.ч. тем кто пропустил, но хочет в дальнейшем быть в курсе, то милости прошу Google+ C++ User Group, Russia.

Некоторые утверждают, что Google+ мертв, но мне кажется вы все не поняли его фишку. Там нет никого, кроме программистов! И в этом его очарование - например, все Linux kernel разработчики там (потому как собственно Linus там). Приходите туда - там тихо, и мухи не летают!

Вообще, конечно, до того как у нас появится какой-то центральный сайт с информацией о российских Си++ событиях (типа isocpp.org но с проекцией на Россию, и конкретные города), узнавать приходится из разных источников и подчас случайно. Например, про готовящееся событие в Москве я узнал спросив @meetingcpp

В любом случае, даже анонс через Google+ сработал вполне хорошо. На Питерское событие пришло порядка 20 человек, и это считалось успехом. Но на московскую встречу зарегистрировались уже 66, и 37 колебались. (Хорошо, что не все пришли, кстати, иначе я не знаю как мы бы решали эту проблему, зал реально был небольшим). Арендованный зал мог вместить 50-60 человек, и уже к концу первого доклада был почти полностью забит. Что можно считать успехом

С другой стороны Си++ программистов в Москве на 2 или 3 порядка больше, и надо задуматься как наиболее эффективно с точки зрения стоимости решать проблему с большим количеством посетителей, если практика устоится и станет популярной. Но об этом поговорим в последнем посте серии...

Но хватит лирики, давайте пойдем по докладам, один за одним, начиная с самой первой сессии.

Григорий Демченко - асинхронность и конкурентность на сопрограммах

Григорий Демченко на примере простейшего http сервера с начала с последовательным кодом, но использующего все нужные Си++11 идиомы (типа лямбда-функций, auto, и последнего oost,asio), а потом и с асинхронным кодом, попытался рассказать про множество проблем, которые вас ждут при написании асинхронного кода на Си++. В любом случае Вас ожидает дилемма: удобный/читабельный код против эффективного использования ресурсов.

Григорий ввёл свои определения "параллельности" и "конкурентности" (которые могут не обязательно совпадать с классическими).

От синхронного кода простого сервера http Григорий перешел к более эффективному асинхронному с отложенными обработчиками в виде различных лямбд. По-прежнему для примеров использовались сервисы Boost::asio/ Автором утверждалось, что многопоточное асинхронное решение плохо масштабируется при росте запросов к серверу, посему было предложено использовать сопрограммы (coroutines) как более эффективное асинхронное решение

Утверждалось что любой чисто асинхронный код приведенный на ранних слайдах можно полуавтоматически перевести на использование сопрограм, и разработанной Григорием библиотеки synca.

При работе с многопоточным приложением и при использовании механизма сопрограмм возникает необходимость сохранять/восстанавливать программный контекст сопрограммы. Для этих целей используются сервисы Boost.context, который уже адаптирован для многих операционных систем и архитектур. На вопрос зачем использовать boost.context при наличии в любом Си окружении sejmp/longjmp Григорий затруднился дать ответ.

Григорий в своей библиотеке добавил множество примитивов для упрощения многопоточного программирования и работы с ресурсами например goWait - ожидание завершения всех аргументов (сопрограмм).

Т.к. сопрограммы могут мигрировать с одного потока из пула на любой другой активный поток, то в библиотеки предоставляется API для переноса сопрограмм из контекста в контекст - "телепортация". Стилистически мне это API не очень понравилось (к тому же в глаза бросалось использование глобальных/нереентрантных данных), но пока будем считать это моей вкусовщиной, и придирками старого брюзги.

Библиотека synca доступна на BitBucket https://bitbucket.org/gridem/synca так что смотрите сами. В целом, несмотря на эти маленькие придирки выше, данный доклад был интересен, и множество упомянутых идиом и паттернов будут крайне полезны многим при написании масштабируемых многопоточных приложений, даже если Вы не будете в итоге использовать synca или Boost::Asio.

Продолжение следует...

3 комментария :

  1. Привет!

    Хотелось бы немного прокомментировать пост.

    > На вопрос зачем использовать boost.context при наличии в любом Си окружении setjmp/longjmp

    Ну возможно я несколько размыто ответил. Если коротко, то setjmp/longjmp не позволяют сохранять контекст для создания сопрограмм.

    > Стилистически мне это API не очень понравилось (к тому же в глаза бросалось использование глобальных/нереентрантных данных)

    Хотелось бы уточнить, какие были замечены глобальные и нереентрантные данные и какие проблемы это сулит?

    ОтветитьУдалить
    Ответы
    1. 1. Все еще не вижу причин почему не позволяет - он сохраняет весь контекст как есть и вы имеете возможность вернуться ровно в ту же функцию. Так конечно есть заморочки с оптимизированными переменными (что решаемо) С другой стороны я абсолютно уверен, что бустовцы вполне в курсе что делают все стандартные си-функции и не стали бы городить огород без причины. Найти её - вот задача.

      2. Может быть это было следствием упрощения примеров для целей презентации но мне сильно резало глаза использование в методах класса функций/синглтонов (или это были конструкторы) от планировщика/управляющего объекта. Еще раз надо взглянуть на весь код библиотеки в целом чтобы понять было ли это оправданным и единственно возможным решением.
      Также мне не очень понятны были все механизмы телепорта, и множества классов введенных. Опять же - надо посмотреть на всю картину в целом

      Удалить
  2. Какие-то неудобные у блоггера комментарии, нет цитирования. Всё работает со скрипом и перекидывая рандомно фокус. Кто-нибудь знает, можно к Блоггеру прикрутить Google+ комментарии?

    ОтветитьУдалить