Раньше мы рассказывали про SObjectizer как про акторный фреймворк для C++, хотя в действительности это не совсем так. Например, уже давно в SObjectizer есть такая классная штука, как mchain-ы (они же каналы из модели CSP). Mchain-ы позволяют легко и непринужденно организовать обмен данными между рабочими потоками. Не создавая агентов, которые нужны далеко не всегда. Как раз на днях довелось в очередной раз этой фичей воспользоваться и упростить себе жизнь за счет передачи данных между потоками посредством каналов (т.е. SObjectizer-овских mchain-ов). Так что не только в Go можно получать удовольствие от использования CSP. В C++ это так же возможно. Кому интересно, что и как, прошу под кат.
Рубрика «concurrency» - 5
Многопоточность в C++ и SObjectizer с CSP-шными каналами, но совсем без акторов…
2017-08-31 в 11:30, admin, рубрики: c++, concurrency, csp, multithreading, open source, Программирование, с++11Concurrency в Swift 3 и 4. Operation и OperationQueue
2017-08-21 в 12:27, admin, рубрики: AsyncOperation, cancellation Operation, concurrency, dependencies, iOS разработка, OperationQueue, swift, swift разработка, класс Operation, Программирование, разработка мобильных приложений, разработка под iOS
Если вы хотите добиться UI
отзывчивости вашего iOS
приложения, выполняя такие затратные по времени куски кода, как загрузка данных из сети или обработка изображений, то вам нужно использовать продвинутые паттерны, связанные с многопоточностью (сoncurrency
), иначе работа вашего пользовательского интерфейса (U
I) начнет сильно замедляться и даже может привести к полной его «заморозке». Вам нужно убрать ресурсо-затратные задачи с main thread
(главного потока), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI
).
В текущей версии Swift 3
и ближайшей Swift 4
(осень 2017) это можно сделать двумя способами, которые пока не связаны с встроенными языковыми конструкциями Swift
, начало реализации которых будет только в Swift 5
(конец 2018).
Один из них использует GCD (Grand Central Dispatch)
и ему посвящена предыдущая статья. В этой статье мы покажем, как достичь отзывчивости UI
в iOS
приложениях с помощью таких абстрактных понятий, как операция Operation
и очередь операций OperationQueue
. Мы также покажем в чем различие этих двух подходов и какой из них в каких ситуациях лучше использовать.
Код для этой статьи можно посмотреть на Github.
Читать полностью »
Имитируем управление устройствами с помощью акторов
2017-07-04 в 6:59, admin, рубрики: actor model, c++, c++ библиотеки, concurrency, multithreading, open source, ПрограммированиеКорни SObjectizer берут свое начало в теме автоматизированных систем управления технологическими процессами (АСУТП). Но использовали мы SObjectizer в далеких от АСУТП областях. Поэтому иногда возникает ностальгия из категории «эх, давно не брал в руки шашек...» Однажды из-за этого в составе SObjectizer появился один из самых объемных примеров — machine_control. Уж очень тогда захотелось «тряхнуть стариной», смоделировать задачку управления оборудованием на современном SObjectizer-е. Ну и под шумок запихнуть в пример разные вкусные фичи SObjectizer-а вроде фильтров доставки, шаблонных агентов и диспетчера с поддержкой приоритетов. Сегодня попробуем рассказать и показать, как это все работает.
Photo by Mike Boening
[Питер] Встреча JUG.ru c легендой параллельного программирования Maurice Herlihy — Transactional Memory and Beyond
2017-06-28 в 21:36, admin, рубрики: concurrency, JUG, jug.ru, multithreading, Блог компании JUG.ru Group, высокая производительность, лекции, митапы, параллельное программирование, системное программирование
У нас праздник! В начале июля в Санкт-Петербурге пройдет SPTCC 2017, летняя школа по параллельному программированию. Одним из лекторов школы станет Морис Херлихи (Maurice Herlihy), легенда параллельного программирования, один из авторов знаменитого учебника «The Art of Multiprocessor Programming».
В четверг, 6 июля, в 19:00 в Университете ИТМО Морис выступит на встрече JUG.ru. На этот раз мы будем говорить не про Java. Тема встречи — транзакционная память.
О чем же нам расскажет Морис?
Транзакционная память
Новое поколение процессорных архитектур предоставляет нам аппаратную транзакционную память (Hardware Transactional Memory — HTM), механизм синхронизации для быстрых транзакций в оперативной памяти. В данном докладе будет показано, что HTM это не просто более быстрый путь для релизации старых-добрых monitor-ов и latch-ей. На самом деле, HTM обеспечивает фундаментальные позитивные изменения в том, как мы программируем многоядерные машины (и возможно даже базы данных), позволяя нам переосмыслить базовые примитивы синхронизации, такие, как lock-и, управление памятью, и многообразие многопоточных структур данных.
Читать полностью »
Подробнее об одном новшестве в свежей версии SObjectizer
2017-05-17 в 9:10, admin, рубрики: actor model, c++, c++ библиотеки, concurrency, multithreading, open source, ПрограммированиеКогда мы начали рассказывать про свой OpenSource акторный фреймворк для C++ на Хабре, мы пообещали описывать некоторые особенности деталей реализации SObjectizer-а. Одна из новых фич, которая была реализована в недавно вышедшей версии 5.5.19, отлично подходит для такого рассказа. Кроме того, она интересна еще и тем, что нам пришлось взглянуть на сценарии использования SObjectizer с совершенно другой стороны. Можно даже сказать, что один из наших шаблонов оказался разорванным.
Речь идет о возможности SObjectizer-а выполнять все свои действия на одной единственной рабочей нити. Начиная с версии 5.5.19 использовать Actor- и Publish/Subscribe модели можно даже в однопоточном приложении. Понятное дело, что акторы должны будут работать в режиме кооперативной многозадачности, но в каких-то случаях именно это и требуется.
А где может потребоваться использовать акторов в однопоточном приложении?
Делаем любой объект потокобезопасным
2017-05-10 в 21:43, admin, рубрики: c++, c++11, concurrency, multithreading, параллельное программирование, Программирование
В этих 3-ех статьях я детально расскажу об атомарных операциях, барьерах памяти и о быстром обмене данными между потоками, а так же о «sequence-points» на примере «execute-around-idiom», а заодно постараемся вместе сделать что-нибудь полезное — умный указатель, который делает любой объект потоко-безопасным для любых операций с его членами переменными или функциями. А затем покажем как используя его достичь производительности высоко-оптимизированных lock-free алгоритмов на 8 — 64 ядрах.
Читать полностью »
Как это работает в мире java. ConcurrentMap
2017-04-23 в 18:11, admin, рубрики: concurrency, hashmap, javaОсновной принцип программирования гласит: не изобретать велосипед. Но иногда, чтобы понять, что происходит и как использовать инструмент правильно, нам необходимо это делать. Сегодня изобретаем ConcrurrentHashMap.
Сперва нам понадобятся 2 вещи. Начнем с 2х тестов — первый скажет, что у нашей реализации нет data races (на самом деле нам нужно проверить, правилен ли наш тест также путем тестирования заведомо некорректной реализации), второй тест мы будем использовать для тестирования производительности с точки зрения throughput.
Шишки, набитые за 15 лет использования акторов в C++. Часть II
2017-03-29 в 6:10, admin, рубрики: actor model, c++, c++ библиотеки, concurrency, multithreading, open source, ПрограммированиеЗавершаем рассказ, начатый в первой части. Сегодня рассмотрим еще несколько граблей, на которые довелось наступить за годы использования SObjectizer-а в повседневной работе.
Продолжаем перечислять грабли
Народ хочет синхронности...
Акторы в Модели Акторов и агенты у нас в SObjectizer общаются посредством асинхронных сообщений. И в этом кроется одна из причин привлекательности Модели Акторов для некоторых типов задач. Казалось бы, асинхронность — это один из краеугольных камней, один из бонусов, поэтому пользуйся себе на здоровье и получай удовольствие.
Ан нет. На практике быстро начались просьбы сделать в SObjectizer возможность синхронного взаимодействия агентов. Очень долго я этим просьбам сопротивлялся. Но в конце-концов сдался. Пришлось добавить в SObjectizer возможность выполнить синхронный запрос от одного агента к другому.
Выглядит в коде это вот так:
Шишки, набитые за 15 лет использования акторов в C++. Часть I
2017-03-22 в 7:12, admin, рубрики: actor model, c++, c++ библиотеки, concurrency, multithreading, open source, ПрограммированиеДанная статья является первой частью текстовой версии одноименного доклада с февральской конференции C++ CoreHard Winter 2017. Так уж получилось, что вот уже 15 лет я отвечаю за разработку фреймворка SObjectizer. Это один из тех немногих все еще живых и все еще развивающихся OpenSource фреймворков для C++, которые позволяют использовать Модель Акторов. Соответственно, за это время неоднократно доводилось попробовать Модель Акторов в деле, в результате чего накопился некоторый опыт. В основном это был положительный опыт, но есть и некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и как это сказалось на развитии SObjectizer-а и пойдет речь далее.
Подозреваю, что многое из того, о чем я буду говорить, хорошо известно в Erlang-сообществе. Но Erlang-сообщество слабо пересекается с C++ сообществом. Кроме того, есть разница между тем, что доступно Erlang-разработчику и тем, что доступно C++ разработчику. Поэтому надеюсь, что данная статья окажется интересной и полезной C++никам.