#include <QThread> #include <QWaitCondition> #include <QMutex> #include <QDebug> const int DataSize = 10000; const int BufferSize = 8192; int buffer1[BufferSize]; QWaitCondition bufferEmpty;//表示缓冲区有空位的条件 QWaitCondition bufferFull;//表示缓冲区有可用数据的条件 QMutex mutex; int numUsedBytes = 0; int rIndex = 0; class Producer : public QThread { public: void run() { for (int i=0; i<DataSize; ++i) { //加锁 mutex.lock(); if (numUsedBytes == BufferSize) { //如果缓冲区已满,则等待缓冲区有空位,bufferEmpty表示缓冲区有空位的条件 bufferEmpty.wait(&mutex); } //往缓冲区写入数据 buffer1[i%BufferSize] = numUsedBytes; //可用数据量加1 ++numUsedBytes; //唤醒等待缓冲区有可用数据的所有线程 bufferFull.wakeAll(); //释放mutex锁 mutex.unlock(); } } }; class Consumer : public QThread { public: void run() { forever { mutex.lock(); if (numUsedBytes == 0) { //如果缓冲区没有可用数据,则等待缓冲区有数据,bufferFull表示缓冲区有数据的条件 bufferFull.wait(&mutex); } qDebug() <<" thread id : "<<currentThreadId()<<" rIndex : "<<rIndex <<" buffer[rIndex]"<<buffer1[rIndex]; //消费数据 rIndex = (++rIndex)%BufferSize; //可用数据量减1 --numUsedBytes; //唤醒等待缓冲区有空位的所有线程 bufferEmpty.wakeAll(); //释放锁 mutex.unlock(); } } }; int main(int argc, char *argv[]) { Producer p1; Consumer c1; Consumer c2; p1.start(); c1.start(); c2.start(); p1.wait(); c1.wait(); c2.wait(); return 0; }
说明: