2011-02-27 33 views
6

有沒有辦法找出當前擁有鎖的線程? 具體而言,我正在尋找一些代碼來打印出阻止鎖定的線程。我想嘗試鎖定給定的超時時間,然後報告哪個線程阻止鎖定被佔用。你如何找到一個鎖(監視器)的所有者?

+0

爲什麼特定於C#?在java的情況下可能會有同樣的疑問。 – 2011-02-27 19:13:48

+1

@Mask問題可能存在於具有線程和鎖定的所有/大多數運行時/語言中,但他特別要求代碼。 – 2011-02-27 19:16:45

回答

7

號只寫代碼:

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即可。當然你不應該這樣做。

+0

您可能想要修復'lockObject'的類型。 – 2011-02-27 19:22:56

+0

你能否解釋一下用於鎖定的對象不應該調用GetHashCode()?你是一般說來還是僅僅爲了這種記憶偷窺的目的? – crokusek 2016-11-19 02:05:26

1

編輯:

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); 
     } 
    } 
} 
+0

java.util.concurrent如何在C#中提供幫助? – 2011-02-27 19:14:18

+0

@Lasse:這個問題不應該特定於C#。在java的情況下可能會有同樣的疑問。我的答案與java – 2011-02-27 19:15:52

+2

有關,我很抱歉,但是如果他需要他的.NET程序的答案,那麼他完全有權詢問關於.NET和C#的問題。如果你想要一個Java程序的答案,你需要自己提問。我拒絕了你提出的編輯來添加java標籤。這是一個.NET問題,這個問題可能存在於java和許多其他運行時/語言中,但是如果你想要一個普通的答案,請問你自己的問題,不要試圖讓它變成一個不是的東西。 – 2011-02-27 19:18:29

相關問題