2016-07-04 2 views
-3

다음과 같은 잠금 시나리오는 잠시 동안 잠금을 놓치고 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.

+3

변수'theLock'을 잠그지 만 할당 된 값이 없습니다. lockObj를 잠그지 않았습니까? – prospector

+0

다른 코드 작성 카운터가 있습니까? – usr

+0

어떤 prospector가 위에서 말했는지, 당신의 샘플 코드는 "theLock"을 사용하지만 "lockObj"를 사용해야 함을 의미합니다. 어쩌면 당신의 예제를 정리할 수 있을까요? 그 외에도 "// 다른 직원이"이벤트 핸들러가 완료되기 전에 또 다른 콜백을 초래할 수있는 모든 것을 호출합니까? –

답변

0

충분하지 않습니다. 여러 앱 도메인을 생성하는 무언가를 사용하고 있기 때문에 두 개의 앱 도메인이 생성되고있는 것 같습니다. Asp.net은 때때로 http 모듈에서이 작업을 수행합니다.

+0

그래, OP가 응용 프로그램을 여러 번 시작할 가능성이 매우 높습니다. 타임스. – VMAtm

+0

내 응용 프로그램은 웹 서버가 아닌 일반 컴퓨팅입니다. 실행되는 동안 단 하나의 콘솔 창만 보입니다. – Moshe

+0

아마도 lockObj의 주소도 출력 할 수 있습니다. 이상한 일을하는 마샬 러가 될 수 있습니다. – keith

관련 문제