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 ...