Read/Write Lock을 어떻게 구현하면 좋을까?

수민·2025년 3월 27일
0

게임서버 이론

목록 보기
7/7

사실.. 옛날에 공부함

https://velog.io/@uiwns811/C-Server-ReaderWriterLock
ㅋㅋ
근데 다시 들으니 이해가 확 되네여
자세한 구현 방법 및 비트플래그 다루는건 위 포스팅을 참고해주시면 감사하겠습니다
아래 내용은~ 구현 방법에 대해 이해한 내용을 복습 겸 작성한 내용이니까여
이 글을 읽으시는 분이 있을지는 모르겠지만여...ㅇㅅㅇ

Read/Write Lock을 왜 쓰나효

멀티스레드 기반에서, 특정 데이터가 대부분 읽기에 사용되고 아주 가끔! 수정된다면 (= 쓰기가 발생한다면).. Mutex로 그냥 락을 무조건 걸어버리면 아쉽다.

대부분은 읽기만 할거라서! 아주 가끔!만 수정될거니까

이런 경우에 사용할 수 있는 기법이 Read/Write Lock이다.

사실 이 부분도 대학생, 취준생 시절에 몇 번 공부했던 내용이었다. 그런데 그 때는 이게 무슨 내용이지 ㅇㅅㅇ 이게 무슨 말이지!! 했는데… 이제와서야 이해가 제대로 되어서 정리하는 내용.

Read / Write Lock이란

말 그대로, Read / Write Lock을 따로 거는거다.

하나의 데이터에 대해, 읽기에는 다중 접근을 허용하되 쓰기에는 허용하지 않는 것

Write할 때에는 읽기 중인 스레드가 존재하면 안된다. (당연함)

Read할 때는 다른 스레드가 읽기 중이어도 된다.

또한, Write에는 재귀적인 락(Recursive Lock)을 허용하고자 한다.

위 내용을 기반으로, 구현하기 위해서 필요한 정보는?

  • 현재 Read중인 스레드가 있는지 유무
  • Write를 하고 있는 스레드가 있는지 유무
    • 어떤 스레드인지 (나인지, 내가 아닌지 알아보기 위함)

Write중인 스레드가 있는지를 확인하기 위해서는, Write중인 스레드의 스레드ID를 저장해주면 되겠다.

다만 Read를 하고 있는 스레드들이 어떤 스레드인지는 굳이 저장해주지 않아도 된다. → Count를 저장해주자.

위 정보를 간단히 저장하기 위해, 4byte의 uint32_t 타입의 변수를 이용한다.

4byte의 상위 16 bit는 Write중인 스레드의 스레드 ID를 저장, 하위 16 bit는 Read한 스레드의 개수를 저장해주면 되겠다.

그래서 상위 16비트가 켜져있으면 WriteLock이 걸린 상태라고 보면 되겠다. (비트플래그로 판별)

uint32_t 
00000000'00000000'0000000'00000000

WriteLock을 걸어주기 위해서는,, 아주 가끔 일어나는 상황이기에 그냥 SpinLock을 걸어준다.

약 5000회 가량 시도해보고, 없으면 yield해줘서 잠깐 스레드 숨 좀 돌리고 오라고 해준다.

그리고 UnLock할 때는 비트를 0으로 밀어버리면 된다.

Read/WriteLock 클래스 구현할거면 RAII 패턴으로 클래스 하나 더 만들어서 RWLockQuard 해주면 좋겠다. (unlock도 자동으로 해주도록)

그러면 구현 끗~


Rookiss 선생님 사랑합니다.
출근길에 강의 듣고 정리한 내용이라~ 기록하기 위함입니다 우하하

profile
우하하

0개의 댓글

관련 채용 정보