有沒有辦法找出當前擁有鎖的線程? 具體而言,我正在尋找一些代碼來打印出阻止鎖定的線程。我想嘗試鎖定給定的超時時間,然後報告哪個線程阻止鎖定被佔用。你如何找到一個鎖(監視器)的所有者?
回答
號只寫代碼:
private int lockOwner;
private object lockObject = new object();
...
void foo() {
lock(lockObject) {
lockOwner = Thread.CurrentThread.ManagedThreadId;
// etc..
}
}
那裏得到鎖的所有者否則無證方式,它不保證工作,但通常不會。當你有一個斷點時,使用Debug + Windows + Memory + Memory1。在地址輸入框中,輸入鎖定對象的名稱(「lockObject」)並按Enter鍵。地址框更改爲內存中對象的地址。編輯它並追加「-4」到地址,按Enter鍵。轉儲中的前4個字節爲您提供十六進制的ManagedThreadId。這適用於32位代碼,只要您從不在鎖定對象上調用GetHashCode即可。當然你不應該這樣做。
您可能想要修復'lockObject'的類型。 – 2011-02-27 19:22:56
你能否解釋一下用於鎖定的對象不應該調用GetHashCode()?你是一般說來還是僅僅爲了這種記憶偷窺的目的? – crokusek 2016-11-19 02:05:26
編輯:
C#:
對於C#,你可以在這裏找到答案:
從Hans Passant
,
class Test {
private object locker = new object();
public void Run() {
lock (locker) { // <== breakpoint here
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
}
java.util.concurrent如何在C#中提供幫助? – 2011-02-27 19:14:18
@Lasse:這個問題不應該特定於C#。在java的情況下可能會有同樣的疑問。我的答案與java – 2011-02-27 19:15:52
有關,我很抱歉,但是如果他需要他的.NET程序的答案,那麼他完全有權詢問關於.NET和C#的問題。如果你想要一個Java程序的答案,你需要自己提問。我拒絕了你提出的編輯來添加java標籤。這是一個.NET問題,這個問題可能存在於java和許多其他運行時/語言中,但是如果你想要一個普通的答案,請問你自己的問題,不要試圖讓它變成一個不是的東西。 – 2011-02-27 19:18:29
- 1. 如何識別Java中的監視器鎖的所有者
- 2. 從監視器的所有者的另一個線程釋放鎖
- 3. 爲什麼一個鎖迫使你等到你真的有鎖?
- 4. 你可以添加一個對象到C#監視器嗎?
- 5. 鎖,監視器,互斥
- 6. 監視器和鎖問題
- 7. 監視一個進程(所有內容)
- 8. 在這種情況下,一個對象擁有默認鎖(監視器鎖)
- 9. 如何找到電報機器人的所有者?
- 10. 如何鎖定對象/成爲顯示器的所有者(Android)
- 11. java中的內部鎖和監視器鎖有什麼區別?
- 12. 監視鎖
- 13. 你是如何得到github回購所有者的名字的?
- 14. 的Android,找到一個Intent的發送者進行監視應用程序
- 15. 如何在windbg中找到我的ReaderWriterLock的鎖持有者(讀者)
- 16. 監視器和鎖之間的區別?
- 17. 使用一個監聽器類來處理所有的監聽
- 18. 如何將所有者組件設置爲一個視圖?
- 19. 如何監視kubernetes中的所有容器狀態?
- 20. 王牌編輯器 - 如何找到一個或所有實例?
- 21. 查找STL迭代器的所有者
- 22. 如何找到mac os中的監視器計數由Cocoa?
- 23. 是否有一個讀監聽器的Java寫鎖?
- 24. 你如何找出你所在的控制器和操作?
- 25. 你如何找到你APP.CONFIG
- 26. DIV沒有擴展到百分比所有監視器尺寸
- 27. 跟蹤一個IP地址,找到所有者
- 28. ASP.Net - 監視器/鎖或互斥
- 29. Yield/Join釋放監視器鎖定?
- 30. 鎖定/多線程監視器
爲什麼特定於C#?在java的情況下可能會有同樣的疑問。 – 2011-02-27 19:13:48
@Mask問題可能存在於具有線程和鎖定的所有/大多數運行時/語言中,但他特別要求代碼。 – 2011-02-27 19:16:45