Qt利用信號量QSemaphore實現生產者,消費者模式

項目新建

在VS2013裏面新建一個Qt的控制檯應用程序,添加main.cpp

定義兩個信號量

#include <QObject>
#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <iostream>

const int gDataSize = 100000;// 總數據量
const int gBufferSize = 5000;// 緩衝區佔字節大小
char Buffer[gBufferSize];// 緩衝區

QSemaphore sFreeSize(gBufferSize);// 可用空間信號量,可用空間初始化爲總大小
QSemaphore sOccupiedSize(0);// 已用空間信號量,初始化爲0;

char MyChar[] = { 'A', 'B', 'C', 'D' };//char* MyChar = "ABCD";
int size = sizeof(MyChar) / sizeof(MyChar[0]);

生產者

class Producer :public QThread
{
public:
	void run() override
	{
		for (int i = 0; i < gDataSize; ++i)
		{
			sFreeSize.acquire();
			Buffer[i%gBufferSize] = MyChar[i%size];
			sOccupiedSize.release();
		}
	}
};

消費者

class Consumer :public QThread
{
public:
	void run() override
	{
		for (int i = 0; i < gDataSize; ++i)
		{
			sOccupiedSize.acquire();
			std::cout << Buffer[i%gBufferSize];
			sFreeSize.release();
			if ((i + 1) % gBufferSize == 0)
			{
				std::cout << std::endl;
			}
		}
	}
};

測試:

int main(int argc, char *argv[])
{
	Producer p;
	Consumer c;

	p.start();
	c.start();

	p.wait();
	c.wait();

	getchar();
	return 0;
}

結果:

在這裏插入圖片描述

所有代碼:


#include <QObject>
#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <iostream>

const int gDataSize = 100000;// 總數據量
const int gBufferSize = 5000;// 緩衝區佔字節大小
char Buffer[gBufferSize];// 緩衝區

QSemaphore sFreeSize(gBufferSize);// 可用空間信號量,可用空間初始化爲總大小
QSemaphore sOccupiedSize(0);// 已用空間信號量,初始化爲0;

char MyChar[] = { 'A', 'B', 'C', 'D' };//char* MyChar = "ABCD";
int size = sizeof(MyChar) / sizeof(MyChar[0]);

// 生產者
class Producer :public QThread
{
public:
	void run() override
	{
		for (int i = 0; i < gDataSize; ++i)
		{
			sFreeSize.acquire();
			Buffer[i%gBufferSize] = MyChar[i%size];
			sOccupiedSize.release();
		}
	}
};
// 消費者
class Consumer :public QThread
{
public:
	void run() override
	{
		for (int i = 0; i < gDataSize; ++i)
		{
			sOccupiedSize.acquire();
			std::cout << Buffer[i%gBufferSize];
			sFreeSize.release();
			if ((i + 1) % gBufferSize == 0)
			{
				std::cout << std::endl;
			}
		}
	}
};
int main(int argc, char *argv[])
{
	Producer p;
	Consumer c;

	p.start();
	c.start();

	p.wait();
	c.wait();

	getchar();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章