(C#) ReaderWriterLock
포스트
취소

(C#) ReaderWriterLock

ReaderWriterLock

여러 스레드를 사용하다 보면 서로 공유되는 데이터가 존재한다.

스레드들의 각 상황마다 읽거나 쓰는 일이 발생되고,

대체적으로 읽는 상황이 더 많고 쓰는 상황은 빈번하게 일어난다.


SpinLock을 사용하는 예제에서 읽는 스레드와 쓰기 스레드가 대기를 한다 가정하면

읽기 스레드가 더 많이 수행하는 반면

쓰기 스레드는 계속 대기하는 상황이 발생하게 되어 성능적으로 떨어지게 된다.


ReaderWriterLock은 데이터를 읽기 위해서 락을 설정하지 않고

쓰기 위해 접근할 때는 락을 설정하는 비대칭적인 락을 구현함으로써

계속 대기하는 SpinLock 상황보다 성능을 높일 수 있다.

💻 코드

간단하게 보상을 받을 때와 보상이 추가될 때의 코드 상황이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();

class Reward {}

// 보상 받기 ( 많이 쓰이는 곳 )
static Reward GetRewardBuId(int id)
{
    _lock4.EnterReadLock();

    _lock4.ExitReadLock();

    return null;
}

// 추가 보상 ( 정말 가끔 쓰일 곳 )
static void AddReward()
{
    _lock4.EnterWriteLock();

    _lock4.ExitWriteLock();
}


💡 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

(C#) 컨텍스트 스위칭과 Event

(C#) ReaderWriterLock 구현 연습