C 多執行緒程式設計之 lock使用注意事項

2022-03-11 12:57:58 字數 1252 閱讀 7795

1.避免鎖定public型別物件。

如果例項可以被公共訪問,將出現lock(this)問題。

如有乙個類myclass,該類有乙個method方法通過lock(this)來實現互斥:

1public

class myclass29

}10}

如果乙個myclass的例項在不同執行緒中執行method方法,可以實現互斥。但如果多個myclass的例項分別在不同的執行緒中執行method方法,互斥將失效,因為此處的lock(this)僅對當前的例項物件進行了加鎖。

2.禁止鎖定型別

lock(typeof(classname))鎖定範圍更為廣泛,由於乙個類的所有例項都只有乙個型別物件(該物件是typeof的返回結果),鎖定它,就鎖定了該物件的所有例項。微軟現在建議(原文請參考:不要使用lock(typeof(classname))。以下的微軟的原文描述:

首先鎖定型別物件是個很緩慢的過程,並且類中的其他執行緒、甚至在同乙個應用程式域中執行的其他程式都可以訪問該型別物件,因此,它們就有可能代替您鎖定型別物件,完全阻止您的執行,從而導致你自己的**的掛起。

這裡的基本問題是,您並未擁有該型別物件,並且您不知道還有誰可以訪問它。總的來說,依靠鎖定不是由您建立、並且您不知道還有誰可以訪問的物件是一種很不好的做法。這樣做很容易導致死鎖。

3.禁止鎖定字串

鎖住乙個字串更為神奇,只要字串內容相同,就能引起程式掛起。

在.net中,字串會被暫時存放,如果兩個變數的字串內容相同的話,.net會把暫存的字串物件分配給該變數。所以如果有兩個地方都在使用lock("my lock")的話,它們實際鎖住的是同乙個物件。

如何正確使用lock呢?

微軟給出的建議是:只鎖定私有物件。

示例**: 

1public

class myclass212

}13}

鎖定私有物件的好處:

首先,類以外的任何**都無法鎖定myclass.someprivatestaticobject,因此避免了許多死鎖的可能。由於死鎖屬於那種最難找到根源的問題,因此,避免發生死鎖的可能是一件很好的事情。

其次,應用程式中只有乙份myclass.someprivatestaticobject的副本,並且系統上執行的其他每個應用程式也只有乙個副本。因此,在同乙個應用程式域中的應用程式之間沒有相互影響。

C 多執行緒Lock

一.為什麼要lock,lock了什麼?當我們使用 執行緒的時候,效率最高的方式當然是 非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要 同步機制 了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作...

boost多執行緒之mutex與lock

mutex類主要有兩種 獨佔式與共享式的互斥量。獨佔式互斥量 mutex 獨佔式的互斥量,是最簡單最常用的一種互斥量型別 try mutex 它是mutex的同義詞,為了與相容以前的版本而提供 timed mutex 它也是獨佔式的互斥量,但提供超時鎖定功能 遞迴式互斥量 recursive mut...

Java 多執行緒之Lock的用法

lock 為執行緒加鎖解鎖,因為多個執行緒在訪問同乙個資源時,乙個資源不能同時給兩個執行緒進行讀寫操作.所以使用執行緒同步的方式來對資源進行訪問限制.下面來看lock的用法 使用流程 1.建立reentrantlock物件,首先,這個reentrantlock類 重入鎖 是一種遞迴無阻塞的同步機制的...