Qt信號量QSemaphore認識一下


   QSemaphore也是一個線程同步工具,這個工具像是QMutex的升級版。對於QMutex而言,只要一個線程拿到QMutex的使用權,其他線程再想要拿就必須等着。QSemaphore的使用權(或稱資源)數量可以是多個,假如設置了QSemaphore的使用權有10個,第一個線程請求了5個剩下5個,第二個線程可以再請求小於等於5個使用權。若第二個線程想要請求8個則會失敗,第二個線程只能繼續等待其他線程釋放資源。

    舉個公共廁所的例子,假如公共廁所有5個坑,QSemaphore是公共廁所的指示牌,指示牌上有五個指示燈。剛開始的時候燈是全滅的,表示坑都可用。這時候來了一個人,他看到有5個指示燈全是滅的,於是進去占了一個坑,有一盞燈亮了。又過了一會兒來了一對基友,他們看到還有4個指示燈是滅的,於是進去占了兩個坑,又有兩盞燈亮了。接着又來兩人占滿了5個坑,5盞燈全亮了。這時候又來了一個人,看到5盞燈全亮了,沒辦法只能在門外等着,直到里面有人出來,指示燈熄滅。

    寫個測試代碼:

    1.定義一個公共數據bool數組,它有5個元素,與之對應的QSemaphore也是5個元素。

blob.png

    2.定義公共數據的使用者Thread(繼承於QThread)。每個Thread都有一個成員變量mId在構造函數中賦值,以示區別。其run函數如下:

blob.png

run函數的功能是請求資源(gSemaphore.acquire()),若請求到資源則去gData中尋找可用的數據並打印,否則等待。當找到可用數據時睡眠3秒(模擬使用過程),最后將使用的數據設置為未使用並釋放資源(gSemaphore.qcquire())。

   3.創建100個Thread的對象並start,查看運行結果:

blob.png

blob.png

程序每隔3秒輸出5個數據被占用的信息。說明請求到資源的線程可以使用,沒爭到的只能等待了。

 

題外話:

本例子其實還有個問題,那就是既然資源總數有5個,那么這里就會有5個線程同時去找gData中可用的數據。就好比5個人同時進入公共廁所后還得去搶坑。這里可以在尋找gData前加一個QMutex,表示先來的先找,后來者等待,這樣可以確保占坑的順序。所以說QSemaphore好像是QMutex的升級版,但兩者是可以配合使用的。

 

 轉自: https://www.fearlazy.com/index.php/post/100.html
 


免責聲明!

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



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