Qt多執行緒互斥

2021-10-24 06:16:34 字數 1784 閱讀 8930

目錄

一、多執行緒與臨界資源的依賴

現象分析

二、互斥和解決方法

三、qmutex的主要成員函式和使用

四、示例**

五、小結

除了上一節所說的,多執行緒在**執行的時序上會有依賴,那麼其他地方是否還有所依賴呢?答案是有的,也就是與臨界資源的問題,所謂臨界資源是指每次只允許乙個執行緒進行訪問(讀或寫)的資源。

假設兩個執行緒都要訪問乙個全域性變數的臨界資源,兩個執行緒誰都不讓誰,進行對資源的搶占,發生了競爭,致使讀寫資料會出現錯誤,嚴重的可能還會導致程式執行崩潰,出錯的現象誰也說不准,比如以下**的示例:

class threadmutexa : public qthread

qdebug() << objectname() << ": run end...";

}};class threadmutexb : public qthread

qdebug() << objectname() << ": run end...";

}};int main(int argc, char *ar**)

1、現象:這段小示例**已經經過半小時的測試,幸運的是並沒有出現程式崩潰,但是仔細一看,資料的列印是有問題的,我們想讓這個全域性變數在a執行緒中加1,在b執行緒中減1,這明顯與我們想法相違背;

2、原因分析:導致這現象的原因是多執行緒對臨界資源的搶占,造成了互斥(競爭)的問題。

1、多執行緒互斥:多執行緒在同乙個時刻都需要訪問(讀/寫)臨界資源;

2、解決方案:qmutex類是執行緒鎖類,它可以保證執行緒間的互斥,利用執行緒鎖可以保證臨界資源的安全性。

1、void qmutex::lock():(1)當鎖空閒時,執行緒獲取鎖並繼續執行;(2)當鎖被獲取時,阻塞並等待鎖的釋放。

2、void qmutex::unlock():釋放鎖,同一把鎖的獲取lock()和釋放unlock()必須成對出現

3、使用

qmutex mutex;

mutex.lock();

// do something you want

mutex.unlock();

將執行緒鎖的概念引入上面的問題當中,並解決問題。

qmutex g_mutex;

class threadmutexa : public qthread

qdebug() << objectname() << ": run end...";

}};class threadmutexb : public qthread

qdebug() << objectname() << ": run end...";

}};int main(int argc, char *ar**)

1、臨界資源每次只允許乙個執行緒進行訪問(讀/寫)操作;

2、qmutex執行緒鎖可以保護執行緒間互斥;

3、執行緒只有獲取鎖成功才能去訪問臨界資源;

4、鎖被其他執行緒獲取時,就必須阻塞並等待鎖的釋放;

5、執行緒鎖的獲取和釋放必須在同乙個執行緒中成對出現,類似new和delete一樣。

QT 多執行緒互斥

今天是七夕佳節,我又來啦,最近到處跑累死人。無論任何程式語言,說到多執行緒,我們肯定要非常注意臨界資源的訪問問題。個人認為多執行緒互斥的內容是比較多,而且比較複雜的,這次的坑的篇幅可能比較長,盡可能用最通俗的語言來表達 什麼是臨界資源?當多個執行緒需要某個資源,而這個資源只能在同一時刻被乙個執行緒所...

Qt 多執行緒同步之互斥鎖

qmutex需要配對使用lock 和unlock 來實現 段的保護 qmutexlocker是另外乙個簡化了互斥量處理的類。qmutexlocker建構函式接受乙個互斥量作為引數並將其鎖定,qmutexlocker的析構函式則將此互斥量解鎖,所以在qmutexlocker例項變數的生存期內的 段得到...

QT多執行緒中的互斥與同步

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!參考自 精通qt4程式設計 qt為實現執行緒的同步與互斥,提供了幾個類。下面主要介紹三個類 一 qmutex和qmutexlocker cpp view plain copy print?class key int createkey int va...