이것은 이론적 인 질문입니다. 나는 해결할 실제 문제가 없으며 단지이 방식의 배경에 대한 추론을 이해하고자합니다.소유자 스레드가 종료되면 ReaderWriterLock이 자동으로 릴리스/종료되지 않는 이유는 무엇입니까?
스레드가 생략되어 ReaderWriterLock을 종료하면 다른 스레드가 원래 스레드가 종료 된 후에도 잠금을 획득하지 못한다는 것을 발견했습니다. ReaderWriterLock이 잠금을 소유 한 스레드가 종료 되 자마자 대기중인 스레드에 잠금을 부여하지 않는 데는 좋은 이유가 있습니까?
다음은이 문제를 보여주는 테스트 사례입니다.
static void Main(string[] args)
{
ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();
Thread t1 = new Thread((a) =>
{
readerWriterLock.EnterReadLock();
// this thread omits to Exit the lock....
});
Thread t2 = new Thread((a) =>
{
readerWriterLock.EnterWriteLock();
});
t1.Start();
t2.Start();
// wait for all threads to finish
t1.Join();
t2.Join();
}
크래시 된 스레드의 컨텍스트에서 잠금 된 리소스가 깨끗한 상태에 있다고 가정하면 위험 할 수 있습니다. 그러나 정상적인 스레드 종료의 맥락에서, 나는 그러한 가정이 안전하다고 생각한다. 성능과 관련하여 두 가지 구현을 제공 할 수 있습니다. 즉, 현재 구현 된 구현과 자동 출시를 구현하는 느리지 만 더 똑똑한 구현입니다. 어쨌든, 당신의 대답을 고맙습니다, 나는 당신이 설명했던 것이 참으로 그렇게 된 이유라고 생각합니다. – Sylvain
Re : 정상적인 스레드 종료, 일부 범위를 벗어날 때 잠금이 해제되도록하는 잠금에 RAII 패턴을 사용할 것을 고려할 수 있습니다. C#에서는 _lock_ 키워드 (일반 잠금) 또는 _try/finally_ 블록 (ReaderWriterLock 용)을 사용하여 범위 종료시 잠금이 해제되도록 할 수 있습니다. 다시 말하지만 스레드가 충돌하거나 더 낮은 수준의 스레드 종료 함수를 호출 한 경우에도 도움이되지 않지만 일부 복잡한 코드 경로에서 잠금을 해제하지 않은 프로그래밍 오류로 인해 교착 상태가 발생할 위험을 줄일 수 있습니다. . – 0xfe