多執行緒 互斥物件和鎖

2021-08-07 22:32:16 字數 758 閱讀 3158

互斥物件的主要操作有兩個,即加鎖(lock)和解鎖(unlock)。當乙個執行緒對互斥物件進行lock操作並成功獲得這個互斥物件的所有權,在此執行緒對此物件unlock前,其他執行緒對這個互斥物件的lock操作都會被阻塞。

有些傾向需要對多個互斥物件進行加鎖,考慮下面的**:

std:

:mutex mt1, mt2;

上面程式中,如果執行緒1執行到第4行的時候恰好執行緒2執行到第8行,那麼就會出現下面的情況:

執行緒1和執行緒2持有各自的mutex,互不鬆手,導致兩個執行緒誰也執行不了,造成死鎖現象。

通常情況,要含有多個互斥物件時,為了避免死鎖,要求在多個執行緒中進行加鎖時應保證其先後順序一致,如下:

std:

:mutex mt1, mt2;

這樣的話,即使執行緒1執行到第4行的時候執行緒2執行到第8行,由於互斥物件mt1已經被上鎖,執行緒2只能等待執行緒1釋放mt1,因此也就不會出現前面例子所說的死鎖現象。

其實更好的做法是使用標準庫中的std::lock和std::try_lock函式對多個互斥物件進行加鎖,std::lock()可以對多個互斥物件一次性進行加鎖。std::lock會使用一種避免死鎖的演算法對多個待加鎖物件進行lock操作,當待加鎖的物件中有不可用物件時std::lock會阻塞當前執行緒直到所有物件都可用。**如下:

std:

:mutex mt1, mt2;

多執行緒 互斥鎖

include include include handle mutex null srwlock g lock 改變乙個變數的時候需要鎖定 int num 6400000 在讀期間,值一直在變化,沒有鎖定。dword winapi reada void p i 使用acquiresrwlocksh...

多執行緒 互斥鎖

package com.yys.thread created by yys on 2017 9 25.兩個執行緒執行 t1如果能拿到02物件則t1執行緒執行完畢 t2如果能拿到o1物件則t2執行緒執行完畢 現在兩個執行緒分別鎖定了對方需要的物件 造成執行緒死鎖 public class testde...

多執行緒 互斥鎖

使用reentrantlock類的lock和unlock方法進行同步通訊 使用reentrantlock類的newcondition方法可以獲取condition物件,需要等待的時候使用conditionde await方法,喚醒的時候用signal方法,不同的執行緒使用不同的condition,這...