Qt4学习笔记(五),QThread学习之QWaitCondition

#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;
}

说明:




猜你喜欢

转载自blog.csdn.net/u012592062/article/details/80290007
qt4
今日推荐