2011-02-27 15 views
6

henüz kilit sahip olduklarını parçacığı keşfetmek için bir yolu var mı? Özellikle bir kilitlenmeyi engelleyen iş parçacığı yazdırmak için bir kod arıyorum. Belirli bir zaman aşımı için kilitlemeye çalışıyorum, daha sonra hangi iş parçacığının kilitlenmeyi engellediğini bildirmek istiyorum. Kilit sahibini almak için bir başka belgesiz yolu, genellikle çalışması garanti değil, varKilidin sahibini nasıl buluyorsunuz (Monitör)?

private int lockOwner; 
private object lockObject = new object(); 
... 
void foo() { 
    lock(lockObject) { 
     lockOwner = Thread.CurrentThread.ManagedThreadId; 
     // etc.. 
    } 
} 

yapar:

+0

Neden belirli C# için? Java durumunda aynı şüphe olabilir. –

+1

@Mask Sorun muhtemelen, iş parçacığı olan ve kilitleyen tüm/birçok çalışma/dilde var, ancak özel olarak kod ister. –

cevap

7

Hayır Sadece kod yazmak. Bir kesme noktanız olduğunda, Debug + Windows + Memory + Memory1'i kullanın. Adres giriş kutusuna, kilitleme nesnesinin adını yazın ("lockObject") ve Enter tuşuna basın. Adres kutusu, bellekteki nesnenin adresine değişir. Düzenleyin ve adrese "-4" ifadesini ekleyin, Enter tuşuna basın. Dökümdeki ilk 4 bayt size onaltılık olarak ManagedThreadId değerini verir. Bu, kilitleme nesnesinde GetHashCode'u çağırdığınız sürece 32 bit kod için çalışır. Tabii ki yapmamalısın.

+0

'lockObject' türünü düzeltmek isteyebilirsiniz. –

+0

Kilit açıklamak için kullanılan bir nesnede GetHashCode() öğesini çağırmamanız açıklanabilir mi? Genel olarak ya da sadece bu hafıza peekinin amaçları için mi söylüyorsunuz? – crokusek

1

REDAKTE:

C#:

, buradan cevap alabilirsiniz: Hans Passant itibaren

,

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# 'da nasıl yardımcı olur? –

+0

@Lasse: Soru C# 'ye özgü olmamalıdır. Java durumunda aynı şüphe olabilir. Maden cevap java –

+2

Üzgünüm, ama o bir .NET programı için onun cevabını ihtiyacı varsa o zaman .NET ve C# hakkında soru soran tamamen hak olduğunu ilgilidir. Bir Java programının cevabını istiyorsanız, kendinize sormanız gerekir. Java etiketlerini eklemek için önerilen düzenlemenizi reddettim. Bu bir .NET sorusudur, problem büyük olasılıkla java'da ve diğer birçok dilde/dilde mevcut, ancak genel bir cevap istiyorsanız, lütfen kendi sorunuzu sorun ve bunu bir şey haline getirmeye çalışmayın. –

İlgili konular