UniSet 2.32.1
|
#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 - значит новых сообщений нет.
При этом место под очередь (буфер) резервируется сразу. Счётчики сделаны (ulong) монотонно растущими. Основные идеи:
Максимальное ограничение на размер очереди сообщений задаётся функцией setMaxSizeOfMessageQueue().
Контроль переполнения очереди осуществляется в push и в top; Если очередь переполняется, то сообщения ТЕРЯЮТСЯ! При помощи функции setLostStrategy() можно установить стратегию что терять lostNewData - в случае переполнения теряются новые данные (т.е. не будут помещаться в очередь) lostOldData - в случае переполнения очереди, старые данные затираются новыми. Под переполнением подразумевается, что чтение отстаёт от писателей больше чем на размер буфера.
Стратегия при переполнении
|
inlinenoexcept |
сколько раз очередь переполнялась
|
inlinenoexcept |
максимальное количество которое было в очереди сообщений
|
noexcept |
поместить сообщение в очередь
|
noexcept |
Извлечь сообщение из очереди