QSemaphore 信號量

QSemaphore類提供了一種通用的計數信號量。信號量是互斥鎖的泛化。一個互斥鎖只能被鎖住一次,而一個信號量可以被多次請求。所以,信號量通常用來保護某個特定數量的資源。

信號量支持兩種基本的操作,acquire()和release():

  • acquire(n)嘗試請求n個資源。如果目前沒有這麼多資源可用,該次調用會阻塞。
  • release(n)釋放n個資源。
同樣,類似於QMutex,改類也有tryAcquire()函數,該函數會在不能請求到資源時立即返回;我們還可以使用available()函數在任何時候得到可用資源的個數。
下面,我們使用一個值爲1的信號量來模擬互斥鎖,同步兩個線程。
新建一個Qt控制檯程序,再建兩個線程類Thread1和Thread2,繼承QThread類。代碼如下:
#ifndef THREAD1_H
#define THREAD1_H
#include <QThread>
#include <QSemaphore>

extern QSemaphore sem;
class Thread1 : public QThread
{
public:
    Thread1(QObject *parent = Q_NULLPTR);

protected:
    void run() Q_DECL_OVERRIDE;
};

#endif // THREAD1_H
#include "thread1.h"
#include <QDebug>

Thread1::Thread1(QObject *parent)
    :QThread(parent)
{

}

void Thread1::run()
{
    while(1)
    {
        sem.acquire();
        qDebug() << "thread1: " << currentThreadId();
        sem.release();
        msleep(500);
    }
}

Thread2的實現類似,我們只是循環的打印出每個線程的id。但由於我們使用二值信號量進行同步,所以兩個線程會交替輸出。運行結果如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章