이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 18751|회답: 0

[팁] C# 읽기/쓰기 잠금 리더 WriterLockSlim 사용

[링크 복사]
게시됨 2017. 3. 9. 오후 4:59:19 | | | |
읽기-쓰기 잠금의 개념은 간단하며, 여러 스레드가 동시에 읽기 잠금을 획득할 수 있지만, 동시에 쓰기 잠금을 얻을 수 있는 스레드는 하나뿐이므로 공유 독점 잠금이라고도 합니다. C#에서는 읽기/쓰기 락 기능을 완료하기 위해 ReaderWriterLockSlim 클래스를 사용하는 것이 권장됩니다.
경우에 따라 객체에 대한 읽기 수가 수정 횟수보다 훨씬 많으며, 단순히 잠금에 의해 잠기면 읽기 효율에 영향을 미칩니다. 읽기-쓰기 잠금이 사용되면 여러 스레드가 동시에 객체를 읽을 수 있으며, 쓰기 잠금이 객체를 점유할 때만 차단됩니다.
간단히 말해, 스레드가 읽기 모드에 들어가면 다른 스레드들도 읽기 모드로 들어갈 수 있으며, 만약 스레드가 쓰기 모드에 들어가고 싶어 한다면 차단해야 합니다. 읽기 모드가 종료될 때까지.
마찬가지로, 스레드가 쓰기 모드에 들어가면 다른 스레드들은 쓰기든 읽든 차단됩니다.
쓰기/읽기 모드에 들어가는 방법은 두 가지가 있습니다:
EnterReadLock은 쓰기 모드 락 상태에 진입하려고 시도합니다.
TryEnterReadLock(Int32)은 읽기 모드 잠금 상태를 입력하려고 시도하며, 정수 타임아웃을 선택할 수 있는 옵션이 있습니다.
EnterWriteLock은 Write Mode 락 상태에 진입하려고 시도합니다.
TryEnterWriteLock(Int32)은 쓰기 모드 락 상태에 진입을 시도하며, 타임아웃 시간을 선택할 수 있습니다.
쓰기/읽기 모드를 종료하는 방법은 두 가지가 있습니다:
ExitReadLock은 읽기 모드의 재귀 수를 줄이고, 결과 카운트가 0(0)이 되면 읽기 모드를 종료합니다.
ExitWriteLock은 쓰기 패턴의 재귀 횟수를 줄이고 결과 카운트가 0(0)이 되면 쓰기 모드를 종료합니다.
사용 방법은 다음과 같습니다:



스레드 3과 스레드 4는 동시에 읽기 모드에 진입할 수 있고, 스레드 5는 5초 후(즉, 스레드 3과 4가 읽기 잠금을 벗어난 후) 쓰기 모드에 들어갈 수 있음을 알 수 있습니다.
위 코드를 수정하여 먼저 쓰기 모드에서 2개의 스레드를 열고, 그 다음 읽기 모드로 스레드를 엽니다. 코드는 다음과 같습니다:
      


결과는 다음과 같습니다:

보시다시피, 스레드 3과 스레드 4는 모두 쓰기 모드에 들어가지만, 스레드 3이 먼저 쓰기 잠금을 차지하므로 스레드 4는 진입 전에 10초를 기다려야 합니다. 스레드 5와 6은 읽기 락을 차지해야 하므로, 스레드 4가 쓰기 잠금을 종료할 때까지 기다렸다가 계속 진행하세요.
TryEnterReadLock과 TryEnterWriteLock은 타임아웃을 설정할 수 있으며, 이 문장으로 진행할 때 스레드는 여기서 차단됩니다. 만약 이 시점에 락이 점유되어 있으면 true를 반환하고, 타임아웃 시간이 아직 잠금장치를 점유하지 않았다면 false를 반환하여 잠금을 포기한 뒤, 다음 코드를 직접 실행합니다.
EnterUpgradeableReadLock
ReaderWriterLockSlim 클래스는 EnterWriteLock 또는 TryEnterWriteLock 메서드를 호출하여 쓰기 모드로 업그레이드할 수 있다는 점에서 읽기 모드와 달리 업그레이드 가능한 읽기 모드를 제공합니다. 한 번에 업그레이드 가능한 모드에는 한 스레드만 있을 수 있기 때문입니다. 업그레이드 가능한 모드에 들어간 스레드는 읽기 모드의 스레드에 영향을 주지 않습니다. 즉, 스레드가 업그레이드 가능 모드에 들어가면 여러 개의 스레드가 동시에 읽기 모드에 들어갈 수 있으며 차단되지 않습니다. 여러 스레드가 이미 쓰기 락을 획득하려고 기다리고 있다면, EnterUpgradeableReadLock을 실행하면 해당 스레드들이 타임아웃되거나 쓰기 락을 종료할 때까지 차단됩니다.
다음 코드는 업그레이드 가능한 읽기 모드에서 쓰기 잠금으로 업그레이드하는 방법을 보여줍니다.



읽기/쓰기 잠금이 성능에 미치는 영향은 명확합니다.
다음 테스트 코드:


위 코드는 500개의 작업 동작을 시뮬레이션하며, 각 작업은 스레드 풀 스레드를 차지하며, 이 중 20개는 쓰기 스레드이고 480개의 읽기 스레드가 시뮬레이션됩니다. 잠금 방식과 ReaderWriterLockSlim 메서드를 테스트하는 데 각각 데이터 읽기와 쓰기 100ms가 소요됩니다. ReaderWriterLockSlim의 경우, 480개의 스레드가 동시에 읽힌다고 가정하면 10ms를 소모하고, 20번의 쓰기 연산이 2000ms를 차지하므로 소요 시간은 2010ms이며, 일반 잠금(lock) 방식의 경우, 모두 독점적이므로 480번의 읽기 연산이 4800ms를 차지하고 20번의 쓰기 연산을 2000ms = 6800ms로 소모한다고 추정할 수 있습니다. 결과는 눈에 띄는 성능 향상을 보여주었습니다.






이전의:Visual Studio 2017 오프라인 설치 패키지 18GB 바이두 클라우드 다운로드
다음:Struts2 버전 2.2 및 2.3의 최신 취약점과 공격 방법
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com