QTcreator 多執行緒(生產者消費者)
阿新 • • 發佈:2019-02-02
qt應用的多執行緒例項簡單實現,語法超級簡單,用兩種方法實現同步和互斥。一種是Semaphore訊號量,另一種是mutex鎖和condition條件變數。下面開始。
第一種,QSemaphore訊號量方式:
通過Qt Creator建立一個控制檯專案,專案建立完以後只有一個main.cpp檔案和一個.pro配置檔案,在main.cpp新增如下內容
#include <QCoreApplication> #include <QSemaphore> #include <QThread> const qint32 DataSize=10; const qint32 BufferSize=4; //倉庫 int buffer[BufferSize]; //控制生產者執行緒訊號量:寫入的資料緩衝區 QSemaphore freeSpace(BufferSize); //控制消費者執行緒訊號量:讀取的資料緩衝區 QSemaphore usedSpace(0); //生產者執行緒類 class threadProducer:public QThread{ public: void run(){ for(int i=0;i<DataSize;++i){ //倉庫有空閒位置,生產一個數據 //空閒位置少一個,控制生產的訊號量加一 freeSpace.acquire(); buffer[i%4]=i+1; qDebug("producer::%d",buffer[i%4]); //可消費的資料多一個,控制消費者訊號量+1 usedSpace.release(); sleep(1); } } }; class threadConsumer:public QThread{ public: void run(){ for(int i=0;i<DataSize;++i){ usedSpace.acquire(); qDebug("consumer:%d",buffer[i%4]); freeSpace.release(); sleep(2); } } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); threadConsumer consumer; threadProducer producer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return a.exec(); }
第二種,QWaitCondition和QMutex方式
#include <QCoreApplication> #include <QThread> #include <QWaitCondition> #include <QMutex> const qint32 DataSize=10;//能產生的最大數 const qint32 BufferSize=4;//最大儲存的數目 int buffer[BufferSize]; QWaitCondition bufferIsNotFull; QWaitCondition bufferIsNotEmpty; QMutex mutex; int usedSpace=0; class threadProducer:public QThread{ public: void run(){ for(int i=0;i<DataSize;++i){ mutex.lock();//如果倉庫滿了,不生產,等待銷費 while (usedSpace==BufferSize) { bufferIsNotEmpty.wait(&mutex); } buffer[i%4]=i+1; qDebug("producer:%d",buffer[i%4]); ++usedSpace; bufferIsNotEmpty.wakeAll(); mutex.unlock(); } } }; class threadConsumer:public QThread{ public: void run(){ for(int i=0;i<DataSize;++i){ mutex.lock(); while (usedSpace==0) { bufferIsNotEmpty.wait(&mutex); } qDebug("consumer:%d",buffer[i%4]); --usedSpace; bufferIsNotFull.wakeAll(); mutex.unlock(); } } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); threadConsumer consumer; threadProducer producer; consumer.start(); producer.start(); consumer.wait(); producer.wait(); return a.exec(); }
構建後實現的效果:
歡迎指正……