2010-07-05 2 views
1

다음 코드 감안할 때 :BCL SpinLock의 잠금/고정 해제시 C# 4.0 스핀/차단?

... 
private static SpinLock logLock = new SpinLock(false); 
... 

private static void ThreadFunc() 
{ 
    bool lockTaken = false; 
    logLock.Enter(ref lockTaken) 
    { 
     try 
     { 
      // do stuff with during an acquired SpinLock 
     } 
     finally 
     { 
      logLock.Exit(); 
     } 
    } 
} 

경우,을은, 인수되는 잠금 거짓받는 스핀 록 같은 현재의 thread의 스핀 않기 때문에 "실패"블록을 입력하고 그것을 획득 할 수 또는이 될 때까지 기다립니다 블록이 우회되고 스레드가 사라집니다.

감사합니다, 정의에 의해

답변

2

스핀 락

스콧 잠금을 오히려 차단보다 취득을 대기하고있는 동안 스레드가 회전됩니다. 잠금을 얻을 수 없다면 Enter는 "실패"하지 않고 기다립니다.

예외를 throw하지 못할 수도있는 유일한 경우는 새 SpinLock() 또는 새로운 SpinLock (true)을 사용하여 스레드 소유권이 활성화 된 경우입니다. 이 경우, thread가 벌써 소유하고있는 락을 취득하려고하면 (자) 예외가 슬로우됩니다. 귀하의 경우 추적을 사용할 수 없도록 잠금을 설정했기 때문에 이러한 상황이 발생하지 않습니다 (SpinLock (false)). thread가 락을 재 취득하려고하면 (자), 락은 데드 록됩니다.

이 내용은 SpinLock.Enter 방법 설명서에 설명되어 있습니다.

+0

감사합니다. VS 2010의 스레드 디버거뿐만 아니라 내 의구심을 확인했습니다. –

1

SpinLock은 기본적으로 변수를 특정 값으로 설정하려고하는 루프입니다.

다음과 같이 구현을 고려할 수 :

, 그것은 단지 의사 (물론, 위의 코드는 안전 스레드되지 않으며, 내가 그 클래스의 메소드의 서명하지 알고 있어요
public struct SpinLock 
{ 
    private volatile bool _Locked; 

    public void Acquire() 
    { 
     while (_Locked) 
      ; 
     _Locked = true; 
    } 

    public void Release() 
    { 
     _Locked = false; 
    } 
} 

-code variant)

그렇습니다. SpinLock이 이미 잠긴 상태 인 경우 획득하려고 시도 할 때까지 사용할 수있게 될 때까지 회전합니다.

또한 기본적으로 (예에서와 같이) 구조체는 누가 잠금을 소유했는지 추적하지 않습니다. 즉, 스레드가 잠금을 두 번 획득하려고 시도하면 두 번째 시도에서 자체가 교착 상태가됩니다.

SpinLock의 목적은 약간의 오버 헤드가있는 사용자 수준 잠금입니다. GC 압력을 추가하지 않으며 커널 동기화 객체를 할당하지도 않으며 단지 몇 개의 필드가있는 struct 일뿐입니다.

+0

감사합니다! 이것은 내가 읽은 책에서 본 "손으로 구겨진"예제와 비슷합니다. 실제 .NET 4.0 BCL SpinLock에 대해 논의하기 직전입니다. 이것은 내가 알아야 할 것을 강화시킨다. –

관련 문제