2015-01-29 6 views
2

나는 ReaderWriterLockSlim에 좌절감을 느껴 ExitWriteLock을 지연시킵니다. 타이머 콜백에서 WriteLock이 해제되는 이유는 무엇입니까?ReaderWriterLockSlim 및 타이머

var _lock = new ReaderWriterLockSlim(); 
_lock.EnterWriteLock(); 
Assert.AreEqual(true, _lock.IsWriteLockHeld); // good 

System.Threading.Timer timer = new Timer(state => 
{ 
    _lock.ExitWriteLock(); //throws exception that lock is not held 
}, null, 1, -1); 

Thread.Sleep(1000); 
Assert.AreEqual(false, _lock.IsWriteLockHeld); 
+2

이 코드가 정확히 무엇을 기대한다고 설명 할 수 있습니까? 이 '타이머'는 어떤 유형입니까? 또한 MSDN을 참조하십시오 : ['IsWriteLockHeld'는 현재 스레드가 쓰기 모드에서 잠금을 입력했는지 여부를 나타내는 값을 _ "반환합니다 (_) (https://msdn.microsoft.com/en-us/library) /system.threading.readerwriterlockslim.iswritelockheould(v=vs.110).aspx) ... – CodeCaster

답변

5

생성자 모양에 따라 System.Threading.Timer을 사용하고 있습니다. 해당 타이머의 콜백은 스레드 풀 스레드에서 실행됩니다.

쓰기 잠금이 해제되지 않습니다, 그것은 당신이 타이머에 지정된 콜백이 다른 스레드에서 실행하고, 해당 스레드 가 쓰기 잠금을 보유하지 않기 때문에 콜백의 주장 Assert.AreEqual(true, _lock.IsWriteLockHeld);이 실패 단지입니다, 예외가 발생했습니다.

하나의 스레드가 잠금을 입력하고 해당 스레드에 대해서만 IsWriteLockHeld이 참이고 해당 스레드 만 잠금을 종료 할 수 있습니다.

+0

ExitWriteLock도 예외를 throw합니다. 하지만 잠금 장치가있는 스레드 만 종료 할 수 있다고 생각하니? – aershov

+1

@ aershov : 예 : –

+0

@ aershov 여기서는 SemaphoreSlim을 사용할 수 있습니다. 독자가 독자가 시맨틱 스를 필요로하지 않는다면 여기에서 사용할 수 있습니다. – usr