#ifndef CONCURRENTQUEUE_H #define CONCURRENTQUEUE_H #include #include #include #define QUEUE_SIZE 10000 template class ConcurrentQueue : protected QList { protected: QMutex mutex; QSemaphore avail{QUEUE_SIZE}; public: void enqueue(const T &t) { avail.acquire(1); QMutexLocker locker(&mutex); QList::append(t); } QVector dequeue(int batchsize) { avail.release(batchsize); // TODO: this sucks QVector result; QMutexLocker locker(&mutex); for(int i = 0; i < batchsize; i++) { result.append(QList::takeFirst()); } return result; } void enqueue(const QVector &t) { QList tmp(t.begin(), t.end()); avail.acquire(t.size()); QMutexLocker locker(&mutex); QList::append(tmp); } unsigned int remaining() { return QUEUE_SIZE - avail.available(); } void clear() { QMutexLocker locker(&mutex); QList::clear(); avail.release(QUEUE_SIZE); } bool dequeue(T &result) { QMutexLocker locker(&mutex); if(QList::isEmpty()) return false; avail.release(1); result = QList::takeFirst(); return true; } }; #endif // CONCURRENTQUEUE_H