다른 사람이이 문제를 본 적이 있는지 궁금합니다. 나는 정적으로 선언 된 객체를 고정하는 응용 프로그램이 방법이 :C# 뭔가 교착 상태의 명백한 버그를 다시 잠그려고 시도합니다.
lock(Group.IsisGroups)
{
do some stuff
}
할-일부-물건 다양한 물건과 내가 같은 잠금 장치를 잠금 시도라는 루틴 중 하나를 수행합니다. 스레드 교착 상태.
내 생각에이 문제는 내 리플렉션 사용과 관련이있다. 클래스 정의에서 찾아서 .Invoke()를 호출하여 메소드 호출을 중간에서 호출한다. 결과 호출 스택은 이것이다 :
[In a sleep, wait, or join]
[External Code]
ConsoleApplication2.exe!Isis.Group.doLookup(Isis.Address gaddr) Line 3774 + 0x13 bytes
ConsoleApplication2.exe!Isis.ReliableSender.GotIncoming(byte type, Isis.Address gaddr, Isis.Address sender, int minStable, Isis.Msg m) Line 10179 + 0x9 bytes
ConsoleApplication2.exe!Isis.ReliableSender.doReceive.AnonymousMethod14(byte type, byte code, int seqn, int truePayLoadLen, int PreFragLen, Isis.Address sender, Isis.Address dest, Isis.Address gaddr, int minStable, int FID, int Fn, int nF, byte[] buf) Line 3120 + 0x80 bytes
[External Code]
ConsoleApplication2.exe!Isis.Msg.doInvokeSingle(System.Delegate del, byte[] barray, System.Type[] types) Line 11582 + 0x10 bytes
ConsoleApplication2.exe!Isis.Msg.InvokeFromBArray(byte[] barray, System.Delegate del) Line 11527 + 0xf bytes
ConsoleApplication2.exe!Isis.ReliableSender.doReceive(object os, Isis.Group g) Line 10034 + 0x71 bytes
ConsoleApplication2.exe!Isis.ReliableSender.Receive(Isis.Group g) Line 10013 + 0xe bytes
ConsoleApplication2.exe!Isis.ReliableSender.StartGroupReader.AnonymousMethod__6(object o) Line 9097 + 0xc bytes
[External Code]
그래서 lock(Group.IsisGroups)
에 대한 초기 호출 스택 ReliableSender.StartGroupReader
하고 바닥 방법, doLookup 잠금을 호출하는 코드 교착 상태에 최고 방법이다. [External Code]
블록은 리플렉션 Invoke()
메서드를 호출 한 곳에서 발생하며 교착 상태가 발생하는 lock()
으로 호출됩니다. 확실히 동일한 객체가 잠겨있는 등 (클래스가로드 될 때 객체가 정적으로 할당되고 유형이 List<Isis.Group>
이고 항목을 추가 및 제거하는 동안 실제 List 객체는 그대로 유지됩니다.)
무엇이 발생할 수 있는지에 대한 제안 이?
추 신 : 매번 발생하지 않습니다. 사실 그것은 내가 넣으면 일어난다.NET을 상당히 듀얼 프로세서 펜티엄에서 내 응용 프로그램의 몇 복사본을 시작하여 꽤 무거워. 이 모든 것이 최신 버전입니다. 그래서 나는 어떤 종류의 .NET 버그를 생각하고 있는가? –
사람들이 .NET 버그라고 생각하는 경우의 99 %에서 의도하지 않은 코드 동작이 나타납니다. 이 경우에 무엇이 잘못되었는지는 확실치 않지만 .NET 버그라는 생각을 할인하는 경향이 있으므로 사용자 잘못이 아닙니다. – Chris
다른 스레드를 살펴보면 그 중 하나가 잠금 객체를 가져 왔고 다른 스레드에 고정되어 있습니다. –