Qt多執行緒練習:通過QSemaphore實現生產者-消費者模型
阿新 • • 發佈:2020-12-28
技術標籤:qt
原始碼
#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();
}
部分執行結果