UniSet 2.32.1
Открытые типы | Открытые члены | Защищенные члены | Полный список членов класса
Класс 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) монотонно растущими. Основные идеи:

Максимальное ограничение на размер очереди сообщений задаётся функцией 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 если сообщений нет