項目新建
在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;
}