源码
#include "mainwindow.h"
/*Buffer[BufferSize]: 生产者向Buffer中填写数据,消费者从Buffer中取出数据*/
/*free_Buf(BufferSize): 信号控制量可以被生产者填充的数目,初始设为100 */
/*buzy_Buf(0): 信号控制量可以被消费者使用的数目,初始设为空 */
#include <QApplication>
#include <QSemaphore>
#include <QThread>
#include <QDebug>
#include <stdio.h>
const int BufferSize=80;
const int DataSize=1000;
int Buffer[BufferSize];
QSemaphore free_Buf(BufferSize);
QSemaphore buzy_Buf(0);
/*生产者类*/
/*free_Buf.acquire:此函数表示生产者可填充单元,初始可获得单元数目等于BufferSize,
调用一次可填充的单元减一。如果缓冲区数据被填满(可填充的单元为0),
此函数将会阻塞,直到消费者调用release函数*/
/*buzy_Buf.release:此函数表示释放单元,可以传入参数表示释放单元的数目,调用
此函数表示消费者可获取单元加一,消费者的acquire函数的阻塞
结束*/
class Producer:public QThread
{
public:
void run() override;
};
void Producer::run()
{
for(int i=0;i<DataSize;i++)
{
free_Buf.acquire();
Buffer[i%BufferSize]=(i%BufferSize);
buzy_Buf.release();
}
}
/*消费者类*/
/*buzy_Buf.acquire:此函数表示获取一个单元,初始可获得单元数目等于0,陷入阻塞直到
消费者中的buzy_buf调用release使可用单元加一,解除阻塞。如果
可获取的单元数目变为0,再次阻塞*/
/*free_Buf.release:此函数表示释放单元,生产者填充单元加一,解除生产者的acquie
函数的阻塞 */
class Customer:public QThread
{
public:
void run() override;
};
void Customer::run()
{
for(int i=0;i<DataSize;i++)
{
buzy_Buf.acquire();
fprintf(stderr,"%d",Buffer[i%BufferSize]);
if(i%16==0&&i!=0)
{
fprintf(stderr,"\n");
}
free_Buf.release();
}
fprintf(stderr,"\n");
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Producer producer;
Customer customer;
producer.start();
customer.start();
producer.wait();
customer.wait();
return a.exec();
}
部分运行结果