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
[출처] Threading - (2.2) 쓰레드간의 데이터 공유|작성자 유후