Qt信號量QSemaphore


  Qt中的信號量是由QSemaphore類提供的,信號量可以理解為對互斥量功能的擴展,互斥量只能鎖定一次而信號量可以獲取多次,它可以用來保護一定數量的同種資源。acquire()函數用於獲取n個資源,當沒有足夠的資源時調用者將被阻塞直到有足夠的可用資源。release(n)函數用於釋放n個資源。

  下面通過一個典型用例:生產者和消費者,來實現這二者之間的同步。整個工程就一個main.cpp,文件如下:

#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <iostream>
#include <QTime>

const int DataSize = 100;
const int BufferSize = 1;
char buffer[BufferSize];

QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0);

class Producer : public QThread
{
protected:
    void run()
    {
        qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
        qsrand(NULL);
        for (int i = 0; i < DataSize; ++i)
        {
            freeSpace.acquire();
            std::cerr<<"P";
            usedSpace.release();
        }
    }
};

class Consumer : public QThread
{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            usedSpace.acquire();
            std::cerr<<"C";
            freeSpace.release();
        }
        std::cerr<<std::endl;
    }
};

int main(int argc, char *argv[])
{
   Producer producer;
   Consumer consumer;
   producer.start();
   consumer.start();
   producer.wait();
   consumer.wait();
return 0;
}

  當DataSize = 100, BufferSize  = 1時,程序運行的界面如下,結果是可以預期的。生產者每次生產一個,消費者就消費一個。

                       

  當DataSize = 100, BufferSize  = 10時,程序運行的界面如下,結果是不可預期的。這里只是列舉兩種情況。

  情況之一:

                       

  情況之二:

                       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM