В продолжении темы Конкурирующая очередь в thread C++
суть которой в кратце
- 3 конкурирующие потока
- п1 самый быстрый читает кадры с камеры
- п2 записывает кадр как есть на диск через интервалы времени
- п3 декодирует кадр, затем кодирует в отдельном потоке и пишет в сеть
- для потоков создан буфер заранее выделенных кадров (длинной 5 шт должно хватать!?)
- алгоритм конкуренции выглядит следующим образом - двунаправленный список из структур временной метки и индекса буфера, п1 забирает
GetIdxPkt
из начала списка индекс, пишет кадр по этому номеру буфера и добавляетPutIdxPkt
индекс в конец, п2 и 3 забирают индекс с конца списка и после обработки кадра добавляют индекс в начало.
Собсна код очереди, указатель на которую передам в эти потоки, нуждаюсь в оценке его адекватности
typedef struct
{
time_t ts;
uint8_t pos;
} stPktLive_t;
enum eQueuePos_t
{
FRONT,
BACK
};
class CQueue
{
private:
const uint8_t maxQ;
uint8_t cntQ;
list<stPktLive_t> ltQ;
mutex mtx;
condition_variable cvPut, cvGet;
using guard = unique_lock<mutex>;
public:
CQueue(uint8_t lQueue)
: maxQ(lQueue), cntQ(0)
{}
~CQueue()
{
if (ltQ.size() > 0) ltQ.clear();
}
int PutIdxPkt(stPktLive_t stV, eQueuePos_t pos)
{
guard g(mtx);
while (cntQ == maxQ) cvPut.wait(g);
mtx.lock();
if (pos == FRONT) ltQ.push_front(stV);
else ltQ.push_back(stV);
cntQ++;
cvGet.notify_all();//notify_one()
mtx.unlock();
return cntQ;
}
int GetIdxPkt(stPktLive_t & stV, eQueuePos_t pos)
{
guard g(mtx);
while (cntQ == 0) cvGet.wait(g);
mtx.lock();
if (pos == FRONT)
{
stV = ltQ.front();
ltQ.pop_front();
}
else
{
stV = ltQ.back();
ltQ.pop_back();
}
cntQ--;
cvPut.notify_all();
mtx.unlock();
return cntQ;
}
};
стар и остановку работу с очередью еще не обдумал