Qt中多线程间的互斥
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Qt中多线程间的互斥
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                文章目錄
- 1 多線程間的互斥
- 1.1 生產(chǎn)消費(fèi)者問(wèn)題
- 1.2 QMutex
- 1.3 死鎖問(wèn)題
- 1.4 信號(hào)量
 
 
1 多線程間的互斥
值得思考的問(wèn)題:
- 多個(gè)線程間除了在時(shí)序上可能產(chǎn)生依賴,在其它方面是否也可能產(chǎn)生依賴呢?
1.1 生產(chǎn)消費(fèi)者問(wèn)題
生產(chǎn)消費(fèi)者問(wèn)題如下:
- 有n個(gè)生產(chǎn)者同時(shí)制造產(chǎn)品,并把產(chǎn)品存入倉(cāng)庫(kù)中。
- 有m個(gè)消費(fèi)者同時(shí)需要從倉(cāng)庫(kù)中取出產(chǎn)品。
- 規(guī)則: - 當(dāng)倉(cāng)庫(kù)未滿,任意生產(chǎn)者可以存入產(chǎn)品。
- 當(dāng)倉(cāng)庫(kù)未空,任意消費(fèi)者可以取出產(chǎn)品。
 
生活中的互斥的例子:
 
 
編程實(shí)驗(yàn):生產(chǎn)消費(fèi)者問(wèn)題
#include <QtCore/QCoreApplication> #include <QThread> #include <QDebug>static QString g_store;class Producer : public QThread { protected:void run(){int count = 0;while(true){g_store.append(QString::number((count++) % 10));qDebug() << objectName() << " : " + g_store;msleep(1);}} };class Customer : public QThread { protected:void run(){while( true ){if( g_store != "" ){g_store.remove(0, 1);qDebug() << objectName() << " : " + g_store;}msleep(1);}} };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Producer p;Customer c;p.setObjectName("Producer");c.setObjectName("Customer");p.start();c.start();return a.exec(); }上面的程序有可能由于讀寫沖突,會(huì)直接導(dǎo)致應(yīng)用程序崩潰。
1.2 QMutex
臨界資源(Critical Resoruce):
- 每次只允許一個(gè)線程進(jìn)行訪問(wèn)(讀/寫)的資源。
線程間的互斥(競(jìng)爭(zhēng)):
- 多個(gè)線程在同一時(shí)刻都需要訪問(wèn)臨界資源。
QMutex類是一把線程鎖,保證線程間的互斥:
- 利用線程鎖能夠保證臨界資源的安全性。
QMutext中的關(guān)鍵成員函數(shù):
- void lock(): - 當(dāng)鎖空閑時(shí),獲取鎖并繼續(xù)執(zhí)行。
- 當(dāng)鎖被獲取時(shí),阻塞并等待鎖釋放。
 
- void unlock(): - 釋放鎖(同一把鎖的獲取和釋放鎖必須在同一線程中成對(duì)出現(xiàn))。
 
QMutext使用示例:
 
 編程實(shí)驗(yàn):線程鎖解決生產(chǎn)消費(fèi)者問(wèn)題
1.3 死鎖問(wèn)題
問(wèn)題:
- 程序有多少臨界資源?需要多少把鎖?
一般性原則:
- 每一個(gè)臨界資源都需要一個(gè)線程鎖進(jìn)行保護(hù)!
看一下如下代碼:
 
 如上代碼會(huì)發(fā)生死鎖。
線程的死鎖概念:
- 線程間相互等待臨界資源而造成彼此無(wú)法繼續(xù)執(zhí)行。
發(fā)生死鎖的條件:
- 系統(tǒng)中存在多個(gè)臨界資源且臨界資源不可搶占。
- 線程需要多個(gè)臨界資源才能繼續(xù)執(zhí)行。
死鎖的避免:
- 對(duì)所有的臨界資源都分配一個(gè)唯一的序號(hào)(r1,r2,… , rn)。
- 對(duì)應(yīng)的線程鎖也分配同樣的序號(hào)(m1,m2,…,mn)。
- 系統(tǒng)中的每個(gè)線程按照嚴(yán)格遞增的次序請(qǐng)求資源。
1.4 信號(hào)量
信號(hào)量的概念:
- 信號(hào)量是特殊的線程鎖。
- 信號(hào)量允許N個(gè)線程同時(shí)訪問(wèn)臨界資源。
- Qt中直接支持信號(hào)量(QSemaphore)。
QSemaphore使用示例:
 
 編程實(shí)驗(yàn):再論生產(chǎn)消費(fèi)者問(wèn)題
注意:嚴(yán)格來(lái)說(shuō)g_buff必須加鎖。
參考資料:
總結(jié)
以上是生活随笔為你收集整理的Qt中多线程间的互斥的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 哪些人最容易被蚊子咬?
- 下一篇: 银行家算法的分析与实现
