UniSet
2.6.0
|
Открытые типы | |
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 - в случае переполнения очереди, старые данные затираются новыми. Под переполнением подразумевается, что чтение отстаёт от писателей больше чем на размер буфера.
Стратегия при переполнении
|
inline |
сколько раз очередь переполнялась
|
inline |
максимальное количество которое было в очереди сообщений
bool MQAtomic::push | ( | const VoidMessagePtr & | msg | ) |
поместить сообщение в очередь
VoidMessagePtr MQAtomic::top | ( | ) |
Извлечь сообщение из очереди