Очередь сообщений на основе atomic переменных.
Чтобы избежать работы с mutex, очередь построена по принципу циклического буфера, c использованием atomic-переменных и попыткой реализовать LockFree работу. Есть монотонно растущий индекс текущей позиции записи (wpos) и есть "догоняющий его" индекс позиции чтения (rpos). Если rpos догоняет wpos - значит новых сообщений нет.
- Предупреждения
- Очередь не универсальная и предназначена исключительно для использования в UniSetObject. Т.к. подразумевает схему "МНОГО ПИСАТЕЛЕЙ" и "ОДИН ЧИТАТЕЛЬ".
При этом место под очередь(буффер) резервируется сразу. Счётчики сделаны (ulong) монотонно растущими. Основные идеи:
- счётчики постоянно увеличиваются
- каждый пишущий поток пишет в новое место (индекс больше последнего)
- читающий счётчик тоже монотонно растёт
- реальная позиция для записи или чтения рассчитывается как (possize) этим и обеспечивается цикличность.
Максимальное ограничение на размер очереди сообщений задаётся функцией setMaxSizeOfMessageQueue().
Контроль переполения очереди осуществляется в push и в top; Если очередь переполняется, то сообщения ТЕРЯЮТСЯ! При помощи функции setLostStrategy() можно установить стратегию что терять lostNewData - в случае переполнения теряются новые данные (т.е. не будут помещаться в очередь) lostOldData - в случае переполнения очереди, старые данные затираются новыми. Под переполнением подразумевается, что чтение отстаёт от писателей больше чем на размер буфера.
ЭТА ОЧЕРЕДЬ ПОКАЗЫВАЕТ В ТРИ РАЗА ЛУЧШУЮ СКОРОСТЬ ПО СРАВНЕНИЮ С MQMutex