QTcreator 多線程(生產者消費者)

qt應用的多線程實例簡單實現,語法超級簡單,用兩種方法實現同步和互斥。一種是Semaphore信號量,另一種是mutex鎖和condition條件變量。下面開始。

第一種,QSemaphore信號量方式:

通過Qt Creator創建一個控制檯項目,項目創建完以後只有一個main.cpp文件和一個.pro配置文件,在main.cpp添加如下內容

#include <QSemaphore>
#include <QThread>
#include <QApplication>

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)
            {
                bufferIsNotFull.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;
    producer.start();
    consumer.start();
    producer.wait();
    consumer.wait();
    return a.exec();
}

 

發佈了35 篇原創文章 · 獲贊 36 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章