2011-04-27 78 views
1

我遇到了一個奇怪的行爲,我的C#應用​​程序。單線程和無遞歸C#中的奇怪死鎖

我正在通過VS2010以調試模式運行應用程序,幾個小時後應用程序只是等待一個鎖釋放,但唯一活着的線程是等待鎖釋放並且沒有遞歸的該函數:

class ProductionNode  { 
    private readonly object _lock = new object(); 
    public bool Activate(long jobId) 
    { 
     lock(_lock) // Doesn't go through here 
     { 
     return DAL.InsertJobIfNotExists(jobId)>0; //SQL PLAIN INSERT IF NOT EXIST COMMAND 
     } 
    } 
    public void HasJobs() 
    { 
     lock(_lock) 
     { 
      return DAL.HasProductionJobs(); 
     } 
    } 
}  

同樣,當我暫停使用VS2010使用該ProductionNode唯一線程應用程序是等待被釋放的_lock對象中的一個。

爲了清楚起見,應用程序可能會激活多個線程中的生產節點,但在發生死鎖的給定場景中,VS只顯示使用ProductionNode對象的單個線程,其他線程使用其他對象類型。

有什麼建議嗎?

乾杯, 多倫

+0

瘋狂的猜測,但也許鎖定一個對象,它不能'只讀'? – 2011-04-27 08:05:56

+0

這是代碼中唯一一個獲取該鎖的代碼?這部分代碼對我來說看起來非常好。 – CodesInChaos 2011-04-27 08:07:19

+2

@Dan鎖定不會發生在引用本身上,而是發生在實例上。所以'只讀'應該沒有效果。 – CodesInChaos 2011-04-27 08:08:18

回答

1

一些提示,可以幫助。我會去下列步驟操作:

  1. 右鍵單擊_lock和使用Visual Studio 上下文菜單中找到所有 引用。也許你在別的地方使用了 鎖(你在更新中做過)。
  2. 確保鎖不staticProductionNode類不是 singleton
  3. 很可能你的線程的是一種媚惑 DAL.InsertJobIfNotExists所以 記錄它的入口和出口 將有助於找到問題根源。
3

我推薦使用windbg(Dbugging工具的Windows,包括在Windows SDK)和psscor2調試您的問題深入一點。

基本上,在windbg嘗試:

1。負載psscor2:

.load C:\工具\ psscor2 \ AMD64 \ psscor2

2與你放置psscor2 DLL的路徑替換。嘗試發現哪些線程持有哪些鎖使用

!syncblk

3。看看線程正在運行的,並比較了線程持有鎖

!threads

4。線程之間

~Xs *[where X is the thread id you got from !threads and that you are interested in because it's holding a lock]*

  1. 看看當前線程的管理調用堆棧交換機以找出發生了什麼事情被收購
鎖之前

!clrstack -a

編輯:

既然你可以推測使用.net 4,您可能需要使用SOSEX而不是psscor2。我到目前爲止還沒有真正使用SOSEX,但是我會看看死鎖命令:!dlk