IT박스

ReaderWriterLock 대 잠금 {}

itboxs 2020. 11. 18. 08:47
반응형

ReaderWriterLock 대 잠금 {}


주요 차이점은 무엇이며 언제 사용해야하는지 설명해주세요.
웹 멀티 스레드 애플리케이션에 중점을 둡니다.


lock 은 하나의 스레드 만 동시에 코드를 실행할 수 있도록합니다. ReaderWriterLock 은 여러 스레드가 동시에 읽기를 허용하거나 쓰기에 대한 단독 액세스 권한을 가질 수 있으므로 더 효율적일 수 있습니다. .NET 3.5를 사용하는 경우 ReaderWriterLockSlim 이 더 빠릅니다. 따라서 공유 리소스가 쓰여지는 것보다 더 자주 읽는다면 ReaderWriterLockSlim. 이를 사용하는 좋은 예는 매우 자주 (각 요청에 따라) 읽고 파일의 내용을 거의 업데이트하지 않는 파일입니다. 따라서 파일에서 읽을 때 많은 요청이 읽기를 위해 열 수 있도록 읽기 잠금을 입력하고 쓰기로 결정할 때 쓰기 잠금을 입력합니다. lock파일에서를 사용 하면 기본적으로 한 번에 하나의 요청을 처리 할 수 ​​있습니다.


당신이있는 경우 ReaderWriterLock을 사용하는 것을 고려 스레드의 많은 것만 필요가 데이터를 읽을 수있는 이러한 스레드가 잠금을 기다리는 차단지고 당신은 종종 데이터를 변경할 필요가 없습니다합니다.

그러나 ReaderWriterLock은 오랫동안 쓰기를 기다리는 스레드를 차단할 수 있습니다.

당신이 후에 따라서 만 ReaderWriterLock을 사용하여 확인 당신이 얻을 높은 경쟁을 "의 잠금을 실제 생활 "당신은 당신이 당신의 잠금 설계를 재 설계 할 수 확인한 잠금이 개최되는 시간을 줄일 수 .

또한 공유 데이터를 데이터베이스에 저장하지 않고 모든 잠금을 처리 할 수 ​​없는지 고려하십시오. 이는 데이터베이스가 충분히 빠르다면 버그를 추적하는 데 어려움을 겪을 가능성이 훨씬 적기 때문입니다. 신청.

에서 어떤 경우 당신은 또한 핸들 공유 데이터에 Aps.net 캐시를 사용하고, 단지 캐시 데이터가 변경에서 항목을 제거 할 수 있습니다. 다음 읽기는 캐시에 새로운 사본을 넣을 수 있습니다.

생각해 내다

"가장 좋은 종류의 잠금은 필요하지 않은 잠금입니다 (즉, 스레드간에 데이터를 공유하지 않음)."


모든 참조 개체 (C #의 기본 메커니즘)와 연결될 수있는 모니터 및 기본 "syncblock"은 lock단독 실행을 지원합니다. 하나의 스레드 만 잠금을 가질 수 있습니다. 이것은 간단하고 효율적입니다.

ReaderWriterLock(또는 V3.5에서는 더 나은 ReaderWriterLockSlim) 더 복잡한 모델을 제공합니다. 더 효율적이라는 것을 알지 못하는 한 피하십시오 (예 : 자신을 지원할 성능 측정이 있음).

가장 좋은 종류의 잠금은 필요하지 않은 잠금입니다 (즉, 스레드간에 데이터를 공유하지 않음).


ReaderWriterLock을 사용하면 여러 스레드가 동시에 ReadLock을 유지하도록 할 수 있으므로 공유 데이터가 한 번에 여러 스레드에서 소비 될 수 있습니다. WriteLock이 요청되면 더 이상 ReadLock이 부여되지 않으며 ReadLock이있는 모든 스레드가이를 해제 할 때까지 WriteLock을 기다리는 코드가 차단됩니다.

WriteLock은 하나의 스레드에 의해서만 유지 될 수 있으며 코드 소비 부분의 관점에서 '데이터 업데이트'가 원자 적으로 표시되도록합니다.

반면에 잠금은 한 번에 하나의 스레드 만 들어갈 수 있도록 허용하며 단순히 공유 데이터를 사용하려고하는 스레드는 허용하지 않습니다.

ReaderWriterLockSlim은 재귀에 대한 더 나은 지원과 기본적으로 ReadLock 인 Lock에서 WriteLock으로 원활하게 (UpgradeableReadLock) 스레드를 이동할 수있는 기능을 갖춘보다 성능이 향상된 ReaderWriterLock 버전입니다.


ReaderWriterLock / Slim은 다중 소비자 / 단일 생산자 시나리오에서 효율적으로 잠글 수 있도록 특별히 설계되었습니다. lock 문으로 그렇게하는 것은 가능하지만 효율적이지 않습니다. RWL / S는 잠금을 획득하기 위해 공격적으로 스핀 록 할 수 있으므로 우위를 차지합니다. 이는 또한 스레드가 잠금을 획득 할 수 없을 때 스레드가 스레드 퀀텀을 포기하여 잠시 동안 일정이 재조정되지 않기 때문에 뒤처지게 만드는 잠금 명령문의 문제인 잠금 호송을 방지하는 데 도움이됩니다.


ReaderWriterLockSlim이 ReaderWriterLock보다 빠르다는 것은 사실입니다. 그러나 ReaderWriterLockSlim의 메모리 소비는 완전히 터무니 없습니다. 메모리 프로파일 러를 연결하고 직접 확인하십시오. ReaderWriterLockSlim을 통해 ReaderWriterLock을 선택합니다.


http://www.albahari.com/threading/part4.aspx#_Reader_Writer_Locks 를 통해 살펴볼 것을 제안 합니다. ReaderWriterLockSlim (ReaderWriterLock 대신 사용하려는)에 대해 설명합니다.

참고 URL : https://stackoverflow.com/questions/2116957/readerwriterlock-vs-lock

반응형