目錄
一、多執行緒與臨界資源的依賴
現象分析
二、互斥和解決方法
三、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...