Repolode
max0x7ba

max0x7ba/atomic_queue

Заголовочная C++14-библиотека с lock-free очередями на кольцевых буферах для обмена сообщениями между потоками с минимальной задержкой от push до pop.

Звёзды
1,899
Форки
221
Открытые issues
1
Последний коммит
6 дней назад

Что это?

atomic_queue — набор C++14-очередей с несколькими производителями и потребителями, распространяемых только в виде заголовочных файлов и построенных на кольцевых буферах фиксированной ёмкости и std::atomic. Их заявленная цель — свести к минимуму время между добавлением элемента в одном потоке и его извлечением в другом. Поэтому библиотека подходит для чувствительного к задержкам кода, например торговых систем и горячих участков логирования.

Ёмкость очередей задаётся при компиляции или создании, поэтому после создания память в куче не выделяется. Есть варианты для атомарных типов элементов и для неатомарных типов, например std::unique_ptr, с буферами на основе массивов или кучи. Варианты на основе массивов с позиционно-независимой адресацией можно размещать в разделяемой памяти для межпроцессного взаимодействия. Доступны как формы push/pop с ожиданием на spinlock, так и неблокирующие try_push/try_pop; также есть режим SPSC, не использующий атомарные операции read-modify-write.

Проект тестируется в CI на Linux x86_64 и ARM, а также в кроссплатформенных запусках под QEMU для RISC-V, PowerPC, s390x и LoongArch и на Windows x86_64 и macOS ARM через CMake. Подключить библиотеку можно через CMake, vcpkg или Conan.

Ключевые возможности

  • 01Библиотека C++14, распространяемая только в виде заголовочных файлов; для использования сборка не требуется.
  • 02Кольцевые буферы фиксированной ёмкости, не выделяющие память в куче после создания.
  • 03Варианты для атомарных и неатомарных типов элементов, включая перемещаемые типы вроде std::unique_ptr.
  • 04Очереди на основе массивов с позиционно-независимой адресацией, которые можно размещать в разделяемой памяти.
  • 05Опциональный режим push и pop с полным порядком FIFO.
  • 06Неблокирующие формы try_push/try_pop и формы push/pop с ожиданием на spinlock.

Сценарии использования

  • Передача рыночных данных или ордеров между потоками в чувствительном к задержкам торговом ПО.
  • Передача записей логов из горячего участка к фоновому потоку форматирования и вывода.
  • Передача небольших сообщений между процессами через сегмент разделяемой памяти.
  • Распределение задач от производителей между пулом рабочих потоков с ограниченной ёмкостью.

Что важно знать

  • Ёмкость очереди фиксируется во время компиляции или создания, поэтому её нельзя увеличить.
  • Функций push или pop с блокировкой на уровне ОС нет, поэтому ожидающие потоки активно опрашивают очередь и расходуют процессорное время.
  • Разработка и тестирование в основном проводились на Linux x86_64, поэтому на других платформах решение проверено хуже.

Темы

Частые вопросы

Что такое atomic_queue?
Заголовочная C++14-библиотека с lock-free очередями на кольцевых буферах для обмена сообщениями между потоками с минимальной задержкой от push до pop. atomic_queue — набор C++14-очередей с несколькими производителями и потребителями, распространяемых только в виде заголовочных файлов и построенных на кольцевых буферах фиксированной ёмкости и std::atomic. Их заявленная цель — свести к минимуму время между добавлением элемента в одном потоке и его извлечением в другом. Поэтому библиотека подходит для чувствительного к задержкам кода, например торговых систем и горячих участков логирования.
atomic_queue можно использовать бесплатно? Какая у него лицензия?
atomic_queue распространяется с открытым исходным кодом под лицензией MIT. Перед использованием в коммерческих продуктах проверьте условия лицензии.
atomic_queue всё ещё поддерживается?
Активно поддерживается. Последний коммит в atomic_queue — 16 окт. 2026 г..
Для чего можно использовать atomic_queue?
Передача рыночных данных или ордеров между потоками в чувствительном к задержкам торговом ПО. Передача записей логов из горячего участка к фоновому потоку форматирования и вывода. Передача небольших сообщений между процессами через сегмент разделяемой памяти. Распределение задач от производителей между пулом рабочих потоков с ограниченной ёмкостью.
Где скачать atomic_queue?
Исходный код и инструкции по установке — на GitHub: https://github.com/max0x7ba/atomic_queue

Описание создано ИИ на основе README проекта. Статистика GitHub обновляется ежедневно.

Похожие проекты