#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;
}
说明: