UniSet 2.44.3
Класс uniset::MQAtomic

#include <MQAtomic.h>

Открытые типы

enum  LostStrategy { lostOldData , lostNewData }

Открытые члены

 MQAtomic (size_t qsize=2000)
bool push (const VoidMessagePtr &msg) noexcept
VoidMessagePtr top () noexcept
size_t size () const noexcept
bool empty () const noexcept
void setMaxSizeOfMessageQueue (size_t s)
size_t getMaxSizeOfMessageQueue () const noexcept
void setLostStrategy (LostStrategy s) noexcept
size_t getMaxQueueMessages () const noexcept
size_t getCountOfLostMessages () const noexcept

Защищенные члены

void mqFill (const VoidMessagePtr &v)
void set_wpos (unsigned long pos) noexcept
void set_rpos (unsigned long pos) noexcept

Подробное описание

Очередь сообщений на основе atomic переменных.

Чтобы избежать работы с mutex, очередь построена по принципу циклического буфера, c использованием atomic-переменных и попыткой реализовать LockFree работу. Есть монотонно растущий индекс текущей позиции записи (wpos) и есть "догоняющий его" индекс позиции чтения (rpos). Если rpos догоняет wpos - значит новых сообщений нет.

Предупреждения
Очередь не универсальная и предназначена исключительно для использования в UniSetObject. Т.к. подразумевает схему "МНОГО ПИСАТЕЛЕЙ" и "ОДИН ЧИТАТЕЛЬ".

При этом место под очередь (буфер) резервируется сразу. Счётчики сделаны (ulong) монотонно растущими. Основные идеи:

  • счётчики постоянно увеличиваются
  • каждый пишущий поток пишет в новое место (индекс больше последнего)
  • читающий счётчик тоже монотонно растёт
  • реальная позиция для записи или чтения рассчитывается как (possize) этим и обеспечивается цикличность.

Максимальное ограничение на размер очереди сообщений задаётся функцией setMaxSizeOfMessageQueue().

Контроль переполнения очереди осуществляется в push и в top; Если очередь переполняется, то сообщения ТЕРЯЮТСЯ! При помощи функции setLostStrategy() можно установить стратегию что терять lostNewData - в случае переполнения теряются новые данные (т.е. не будут помещаться в очередь) lostOldData - в случае переполнения очереди, старые данные затираются новыми. Под переполнением подразумевается, что чтение отстаёт от писателей больше чем на размер буфера.


ЭТА ОЧЕРЕДЬ ПОКАЗЫВАЕТ В ТРИ РАЗА ЛУЧШУЮ СКОРОСТЬ ПО СРАВНЕНИЮ С MQMutex

Перечисления

◆ LostStrategy

Стратегия при переполнении

Методы

◆ getCountOfLostMessages()

size_t uniset::MQAtomic::getCountOfLostMessages ( ) const
inlinenoexcept

сколько раз очередь переполнялась

◆ getMaxQueueMessages()

size_t uniset::MQAtomic::getMaxQueueMessages ( ) const
inlinenoexcept

максимальное количество которое было в очереди сообщений

◆ push()

bool MQAtomic::push ( const VoidMessagePtr & msg)
noexcept

поместить сообщение в очередь

◆ top()

VoidMessagePtr MQAtomic::top ( )
noexcept

Извлечь сообщение из очереди

Возвращает
не валидный shatred_ptr если сообщений нет