1. 程式人生 > >QTcreator 多執行緒(生產者消費者)

QTcreator 多執行緒(生產者消費者)

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();
}

構建後實現的效果:

歡迎指正……