ReaderWriterLock

읽을 때는 여러 쓰레드가 동시에 읽을 수 있고 쓰기를 할 때만 배타적 잠금을 할 수 있도록 해주는 것이 ReaderWriterLock 클래스입니다.

ReaderLock이 걸린 상황에서는 다른 쓰레드도 같은 자원에 접근해서 읽을 수 있습니다. WriterLock이 걸리면 다른 쓰레드는 접근할 수 없습니다. 단 WriterLock을 얻기 위해서는 현재 걸려있는 모든 ReaderLock이 해제되어야 합니다.

ReaderWriterLock 클래스 Method 입니다.

 IsReaderLockHeld  ReaderLock 걸려있는지 여부
 IsWriterLockHeld  WriterLock 걸려있는지 여부
 AcquireReaderLock  지정 시간내에 ReadLock을 건다. 시간초과시 응용프로그램 오류.
 AcquireWriterLock  지정 시간내에 WriterLock을 건다. 시간초과시 응용프로그램 오류.
 DowngradFromWriterLock  WriterLock을 ReaderLock으로 변경
 ReleaseReaderLock  ReaderLock 해제
 ReleaseWriterLock  WriterLock 해제
 UpgradeToWriterLock  ReaderLock을 WriterLock으로 변경

 

[예제]

참고로 Downgrade/Upgrade시에는 이전 Lock 수준으로 복귀할 때 필요한 정보로 LockCookie를 사용합니다.

 

지금까지의 synchronization lock은 thread간의 데이터공유에 한정하여 사용된 것들입니다. 운영체제의 커널(kernel)에서 제공되는 object인 Mutex, Semaphore, Event(AutoResetEvent, MaunalResetEvent) 등은 AppDomain 및 Process 경계를 넘어 데이터를 공유하고 lock을 걸 수 있는  기능을 제공합니다. 이들의 공통점은 WaitHandle을 Base 클래스로 하고 있다는 것입니다. WaitHandle은 Win32 동기화 핸들을 캡슐화한 클래스로 현재 특정 공유자원에 대해 배타적 접근(lock)을 하고 있는 쓰레드간에 신호를 주고 받을 수 있도록 하여 공유자원에 대한 배타적 접근(lock)을 원하는 오브젝트들이 제대로 작동할 수 있도록 해주는 메카니즘을 제공합니다.

 

Mutex

 

Semaphore

 

Event

AutoResetEvent

ManualResetEvent

 

Posted by penguindori