Topic

C++

A collection of 12 issues

Boost ASIO coroutines. NATS client.

Теперь я добрался до практического применения разработанных ранее барьеров/секвенсоров (SequenceBarrier, SingleProducerSequencer, MultiProducerSequencer) для короутин. В этот раз будет реализован клиент для NATS. Концептуально эта система очередей довольно проста: клиенты могут отправлять события в очередь (топик), клиенты могут подписываться на получение событий из очереди (топика). Ключевая фишка - отсутствие необходимости
21 min read

Boost.ASIO coroutines. Cancellation.

В ASIO есть возможность отмены асинхронных операций и в частности отмена ожидания завершения короутин, запущенных через co_spawn. Типичный пример использования это ожидание события/данных с таймаутом: std::variant results = co_await ( async_read(socket, input_buffer, use_awaitable) || timer.async_wait(use_awaitable) ); if (result.index() == 0) { // Read complete
13 min read

Boost.ASIO coroutines. MultiProducerSequencer.

Следующий примитив синхронизации из cppcoro - MultiProducerSequencer. Он предназначен для координации нескольких продюсеров и одного или нескольких (с использовании группы барьеров) потребителей. Продюсеры и потребители могут работать в разных тредах, основное назначение этого секвенсора - реализация thread-safe очереди. Если продюсер только один, то стоит применять SingleProducerSequencer для избежания излишнего оверхеда.
13 min read

Boost.ASIO coroutines. Sequencer & multiple consumers.

Основное назначение этой заметки не столько реализация работы секвенсера с несколькими потребителями (это не самый частый вариант использования), сколько более подробное рассмотрение взаимодействия продюсера и потребителей. Она является небольшим прологом к секвенсеру (тут будет ссылка на MultiProducerSequencer) со множеством продюсеров. Начнем с кейса с одним продюсером и одним потребителем. Размер
5 min read

Boost.ASIO coroutines. SingleProducerSequencer.

Следующий примитив синхронизации из cppcoro. Он предназначен для координации  доступа к кольцевому буферу одного продюсера и одного подписчика. Продюсер и подписчик могут работать в разных тредах (собственно это основное назначение этого класса - реализация thread-safe очереди). Это часть паттерна Disruptor из Java-мира. Продюсер захватывает один или более слотов в буфере,
4 min read

Boost.ASIO coroutines. SequenceBarrier.

В этот раз буду реализовывать sequence barrier, аналогичный реализации в cppcoro.  Этот примитив синхронизации координирует работу одного издателя (producer) и одного или нескольких подписчиков (consumers) относительно монотонно-возрастающей (неубывающей) последовательности. В дальнейшем он будет применен в качестве курсора в кольцевого буфера. Intro Издатель периодически публикует новое значения последовательности, а подписчики ждут
13 min read

Boost.ASIO coroutines. Event. Работа над ошибками.

В предыдущей статье был описан элемент синхронизации Event, аналогичный оному из cppcoro. Ошибка была в том, что весь механизм синхронизации был перенесен из cppcoro в другую среду без какой-либо валидации. Правильным бы на тот момент решением было бы использовать в атомарных операциях memory order по умолчанию (std::memory_order_seq_
18 min read

Boost.ASIO coroutines. Event.

В этот раз реализую простейший примитив синхронизации двух короутин. Его назначение довольно просто: одна короутина приостанавливается на ожидании сигнала, другая этот сигнал отправляет. По сути это аналог пары std::future/std::promise. Короутины могут выполняться в разных потоках, ожидать сигнала может только одна короутина. #include "event.h" Event event; auto
2 min read

Boost.ASIO coroutines. Scheduler.

Для реализации примитивов синхронизации короутин (например sequence_barrier) нужен механизм для приостановки короутины до следующей итерации цикла событий. По сути это аналог функции pthread_yield для синхронного кода. Пример использования выглядит как-то так: do { co_await schedule(executor); do_some_thing(); } while(condition); а типовая реализация так: struct Awaiter { boost:
1 min read

Инъекция зависимостей: Boost.DI

В книге Чистый код Роберт Мартин сравнивает модульное тестирование с серебряной пулей. Инъекция зависимостей это винтовка для этой пули, из которой почти любое legacy можно расстрелять и превратить в поддерживаемую  систему. Legacy В качестве примера будет использована следующая система (исходники тут). Есть вычислитель (Executer), обсчитывающий входные данные в параллельном потоке
7 min read

Subscribe to Заметочки

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe