1. 程式人生 > 其它 >Qt多執行緒練習:通過QSemaphore實現生產者-消費者模型

Qt多執行緒練習:通過QSemaphore實現生產者-消費者模型

技術標籤: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(); }

部分執行結果
在這裡插入圖片描述