다음과 같은 잠금 시나리오는 잠시 동안 잠금을 놓치고 2 개의 코드 인스턴스가 병렬로 실행되도록합니다. 코드 분석/수정에 도움을 주시면 감사하겠습니다.C# 잠금이 작동하지 않습니다 (?)
public delegate void _D(A a);
namespace ExternalDll {
public event _D D;
}
namespace MainSpace {
ExternalDll _externalDll;
public static object lockObj = new object();
public static int counter = 0;
.
.
_externalDll.D += new _D(myEventHandler);
.
.
void myEventHandler(A a) {
lock (lockObj) {
counter++;
// do staff, printouts, etc.
Console.WriteLine("First={0}\n", counter);
// do other staff
Console.WriteLine("Second={0}\n", counter);
}
}
}
ExternalDll은 (유형 A) 정보 a와 네트워크 통신을 수신하는 dll 파일입니다. a를 입력으로 사용하여 이벤트 D를 호출합니다.
주 네임 스페이스는 ExternalDll에 의해 시작된 이벤트 D에 myEventHandler를 등록합니다. myEventHanlder 내부에는 잠금이 있으므로 예상되는 동작은 잠금 섹션 내의 코드가 언제든지 두 번 이상 실행되지 않는다는 것입니다.
그러나 응용 프로그램을 실행하면 잠긴 코드가 "병렬로"두 번 실행되는 경우가 있습니다.
First=0
First=1
Second=0
Second=1
이 특히 externalDll에 매우 짧은 지속 시간 (<이 1us) 내에 도착 버스 티 네트워크 이벤트의 경우에 발생합니다 예를 들어, 내가 좋아하는 인쇄물을 볼 수 있습니다.
내 질문/요청은 다음과 같습니다
은 무엇 잠금 문이 잘못된 동작을 만들 수 있습니다. 잠긴 코드의 인스턴스 2 개를 허용합니까?
원하는 잠금 동작을 제공하도록 코드를 향상시키는 방법.
감사합니다,
-Moshe.
변수'theLock'을 잠그지 만 할당 된 값이 없습니다. lockObj를 잠그지 않았습니까? – prospector
다른 코드 작성 카운터가 있습니까? – usr
어떤 prospector가 위에서 말했는지, 당신의 샘플 코드는 "theLock"을 사용하지만 "lockObj"를 사용해야 함을 의미합니다. 어쩌면 당신의 예제를 정리할 수 있을까요? 그 외에도 "// 다른 직원이"이벤트 핸들러가 완료되기 전에 또 다른 콜백을 초래할 수있는 모든 것을 호출합니까? –