문제

입니다 이 패턴은 상호 배제에 대한 안전한 것으로 생각으로 그것입니까?그렇다면,당신은 무엇을까요?

lock (_lock) {
    if (_flag) return;
    else _flag = true;
}
try {
    //critical code...
}
finally {
    _flag = false;
}

고 싶을 보장 중요한 섹션이지만,다른 스레드가 말뚝을 획득하기 위해 대을 잠급니다.분명히 나 있는지 확인 깃발을 설정합니다.은 더 나은 방법이 있을까?

도움이 되었습니까?

해결책

아니,그게 안전하지 않습니다.당신을 위해 상호 배타적인을 차단하지 않고,사용할 수 있습니다.TryEnter:

if (Monitor.TryEnter(lockObj, 0)) {
    // got the lock !
    try {
        // code
    }
    finally { // release the lock
        Monitor.Exit(lockObj);
    }
}

다른 팁

당신은 보 Monitor.TryEnter?

의 정확성에 상호 배제 패턴에 따라 달라 할당 _flag=false 되는 원자.어떤 일이 일어나게 될지 상상하는 경우에 할당할 수 없습에 의해 중단되는 또 다른 스레드가 있습니다.는 경우는 중간 결과의 할당 것으로 해석할 수 있는 거짓에 의해 테스트,하나의 할당을 일으킬 수 있는 여러 쓰레드를 입력의 중요한 섹션입니다.

의 정확성에 상호 배제 패턴에 따라 달라 부재의 최적화에서 컴파일할 수 있는 정렬 순서의 문이 있습니다.상상해"스마트"컴파일러는 이동 할당 _flag=false 기 때문에,_flag 이지에서 참조하는 코드 사이에(그리고 코드 사이에 던지지 않는 예외).컴파일러는 다음을 최적화 부분에서 잠금 섹션을 읽

if(_flag) return;

모두의 예는 이유는 패턴이 실패할 수 있는 매우 투기적이고 내 생각하는 당신이 안전하면서 작동합니다.그러나 존재하는 상태에서,또 다른 옵션으로 작동하는 데 필요한,당신은 잘 사용하는(다른 게시물).이 있는 경우 다른 개발자에서 동일한 코드,그들이 필요로 하지 않는지 여부를 고려하는 패턴을 작동합니다.

지 않는 간단하 lock(Object) 문 작동하는가?뒤에서 그것을 만듭니다 Monitor 고 중요한 내 섹션 try... finally 니다.

private static readonly Object lockMe = new Object();
lock(lockMe)
{
    // critical code
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top