|
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 - в случае переполнения очереди, старые данные затираются новыми. Под переполнением подразумевается, что чтение отстаёт от писателей больше чем на размер буфера.
-------------------------------- ЭТА ОЧЕРЕДЬ ПОКАЗЫВАЕТ В ТРИ РАЗА ЛУЧШУЮ СКОРОСТЬ ПО СРАВНЕНИЮ С MQMutex --------------------------------
Стратегия при переполнении
| size_t uniset::MQAtomic::getCountOfLostMessages | ( | ) | const [inline] |
сколько раз очередь переполнялась
| size_t uniset::MQAtomic::getMaxQueueMessages | ( | ) | const [inline] |
максимальное количество которое было в очереди сообщений
| bool MQAtomic::push | ( | const VoidMessagePtr & | msg | ) |
поместить сообщение в очередь
| VoidMessagePtr MQAtomic::top | ( | ) |
Извлечь сообщение из очереди
1.7.6.1