瞧一瞧Qt的QMutex

2022-06-28 22:48:19 字數 2805 閱讀 3475

mutex一般稱為互斥鎖,是用於執行緒同步的。qt幫助文件對qmutex有一段描述:qmutex是為了保護乙個物件、資料結構或**段,在同乙個時刻只能有乙個執行緒能訪問它。我覺得這句話很容易誤導人,看這句話會把關注點放在物件、資料結構或**段上。但是個人覺得qmutex重點應該放在qmutex與執行緒的關係上。直接通過例子來看一看。

a.不使用qmutex的多執行緒運**況。

1.新建乙個類thread,繼承於qthread,重寫run函式。

c++

void thread::run()

run函式裡執行了三個操作,都是列印。

2.建立兩個thread物件並start。這樣就會有兩個執行緒。

c++

thread t1;

thread t2;

t1.start();

t2.start();

這裡我們沒有使用qmutex,看看運**況。

從結果可以看到兩個執行緒的三個操作是交替執行(也有可能是別的情況)。

b.加上qmutex。

3.在run函式中加上qmutex.

c++

qmutex mutex; //全域性的物件

void thread::run()

運**況如下:

從結果可以看出,先執行完第乙個執行緒的三個操作,再執行第二個執行緒的操作。感覺好像是mutex鎖住了那三個qdebug操作。

c.再來乙個不加鎖的執行緒。

4.新建乙個類thread2,繼承於qthread,重寫run函式。

c++

void thread2::run()

為了區分,qdebug最後加上了「--thread2--」

5.建立thread2類的物件,並start

c++

thread  t1;

thread t2;

thread2 t3; //thread2物件..

t1.start();

t2.start();

t3.start();

檢視執行結果:

從結果可以看到原來的乙個執行緒的三句話沒有連續列印,這樣看好像mutex並沒有鎖住三個qdebug的操作。但是如果把thread2的執行緒列印結果去掉,另外兩個執行緒的結果還是按順序執行的,所以說mutex是起作用的。

那qmutex的作用該怎麼理解呢? 假如把qmutex比作是乙個標籤,它有兩個狀態:使用中和未使用。從上面的例子看

mutex在第乙個執行緒(t1)中標記為使用中(lock操作)。

這時第二個執行緒也想要標記(lock),但是mutex已經被標記為使用中了,所以他只能等,之道t1把mutex標記為未使用(unlock)。在等待的期間t2中lock以下的操作都沒有被執行。所以會看到t1的三句話按順序出來了。

第三個執行緒t3根本就不管另外兩個執行緒,老子自己執行自己的(它沒有呼叫lock,所以沒有被鎖住)。該在什麼時刻執行就什麼時候執行。

綜上,如果還要讓三句話按順序執行,還需要在t3上加上那把鎖:

例:

從qthread派生兩個類thread和thread2,兩個類的run函式分別如下:

c++

int number = 0; //全域性變數

void thread::run()

void thread2::run()

兩個執行緒的工作就是使用全域性變數number來計算獲得最終結果。若thread執行緒先執行那麼預期的結果將是thread輸出15。但是執行結果卻是:

24是怎麼來的呢?number在thread執行緒中+=5變為了5,然後在thread2執行緒中+=3變為了8,所以在thread執行緒中再計算val的值時number已經變為了8,結果就是24了。

(說明:兩個run函式中都有加qdebug()<

c++

void thread::run()

void thread2::run()

執行結果:

qmutex雖好,但使用時也要小心一點,有lock就要unlock。不然的話別的執行緒就慘了。比如說把thread::run中的mutex.unlock注釋掉。那麼執行結果就是:

只有thread的結果列印出來了,那是因為thread2還卡在mutex.lock這裡,它還在問mutex你解鎖了沒.....

**:

EL隱式物件,忘記了的來瞧一瞧

隱含物件名稱 描述pagecontext 對應於jsp頁面中的pagecontext物件 pagescope 代表page域中用於儲存屬性的map物件 requestscope 代表request域中用於儲存屬性的map物件 sessionscope 代表session域中用於儲存屬性的map物件 ...

C語言 函式部分 各種經典題目,快過來瞧一瞧看一看

1.實現乙個函式,列印乘法口訣表,輸入n,輸出n n口訣表,define crt secure no warnings 1 include int print int x printf n int main 2.使用函式實現兩個數的交換。傳值呼叫,函式的實參和形參分別占用不同的記憶體塊,在函式部分,...

小姐姐們,小哥哥們,進來瞧一瞧啊吐舌頭

常用正規表示式大全 一 校驗數字的表示式 1 數字 0 9 2 n位的數字 d 3 至少n位的數字 d 4 m n位的數字 d 5 零和非零開頭的數字 0 1 9 0 9 6 非零開頭的最多帶兩位小數的數字 1 9 0 9 0 9 7 帶1 2位小數的正數或負數 d d 8 正數 負數 和小數 d ...