Многопоточность В C++ И Sobjectizer С Csp-Каналами, Но Вообще Без Актеров...

Ранее мы говорили о SОбъектайзер как каркас актера для C++, хотя на самом деле это не совсем так.

Например, в SObjectizer уже давно есть такая крутая штука, как мчейны (они же каналы из модели CSP ).

Mchains позволяют легко и непринужденно организовать обмен данными между рабочими потоками.

Без создания агентов, которые не всегда нужны.

Буквально на днях у меня появилась возможность еще раз воспользоваться этой функцией и упростить себе жизнь, передавая данные между потоками через каналы (т. е.

SObjectizer mchains).

Так что CSP можно использовать не только в Go. Это также возможно в C++.

Если кому интересно, что и как, смотрите кат. Задача была такая: есть некая сторонняя система, к которой нужно делать синхронные запросы.

Нужно было посмотреть, как поведет себя эта система, если запросы к ней идут не в один поток, а в несколько.

Для этого необходимо было преобразовать существующий однопоточный клиент в многопоточный клиент, рабочие потоки которого выдавали бы собственный поток запросов в стороннюю систему.

Полный список запросов, которые нужно было выполнить, находился в отдельном файле.

Значит нужно было последовательно прочитать этот файл, получить следующий запрос и отдать его одному из свободных рабочих потоков.

Каждый поток подсчитывал количество выполненных им запросов.

Необходимо было определить, сколько времени потребуется на чтение и обработку всех запросов, а также посчитать, сколько запросов было выполнено.

Простое решение было очевидным.

Существует основной рабочий поток, который читает файл запроса.

Каждый запрос помещается в общую очередь запросов.

Откуда запросы анализируются рабочими потоками.

Те.

рабочий поток берет из очереди первый запрос, выполняет его, затем берет из очереди новый первый запрос и т. д. Если очередь пуста, то рабочий поток должен быть приостановлен до тех пор, пока в очереди что-нибудь не появится.

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

Мчейны от SObjectizer просто позволит вам обойтись без написания собственных потокобезопасных очередей.

Для решения этой проблемы потребовалось два mchains. Первый mchain используется для передачи запросов на чтение рабочим потокам.

Основной поток пишет в него запросы, рабочие потоки читают оттуда запросы.

Когда файл запроса прочитан полностью, основной поток просто закрывает этот mchain. Соответственно, как только рабочие потоки увидят, что в mchain ничего нет и он закрыт, они завершат свою работу.

Второй mchain требовался для того, чтобы рабочие потоки могли передавать в основной поток информацию о том, что они сертифицировали свою работу и сколько запросов они обработали.

Рабочие потоки пишут в этот mchain только одно сообщение.

А основной поток читает только из этого mchain. Что ж, теперь вы можете увидеть, как все это выглядит в коде.

Код без комментариев, т.к.

это была одноразовая программа "на выброс".

Поэтому необходимые пояснения будут даны после соответствующего фрагмента кода.

Начнем с функции run_app, которая вызывается из main() сразу после того, как программа анализирует параметры командной строки:

   

void run_app( const app_args_t & args ) {

Теги: #c++11 #csp #многопоточность #параллелизм #C++ #открытый исходный код #программирование #C++
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.