인프런 커뮤니티 질문&답변

(게임학전공)장지현님의 프로필 이미지
(게임학전공)장지현

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

ReaderWriterLock 구현 연습

재귀적 락 허용

작성

·

473

1

재귀적 락을 허용 하지 않았을때 ReaderWriterLock은

 

Write할때 Read가 같이 일어나면 Write하기 전에 있던 데이터와, Write한 후의 데이터가 공존해서 Read해가기 때문에, ReaderWriterLock을 사용 하는거 같은데(Read만 해갈때는 문제 없어서 Read는 공용으로 가능)

어떤 경우에 재귀적 락을 허용하는지 잘 모르겠습니다.

재귀적 락을 허용했을때는 한 쓰레드가 여러개의 데이터를 write,read할때 사용 되는건가요?

답변 1

5

Rookiss님의 프로필 이미지
Rookiss
지식공유자

재귀적 락은 동일한 쓰레드에서 연속해서 Lock을 잡는 경우를 케어해주는겁니다.

컨텐츠를 만들다 보면 함수가 아주 많아지고,
특정 함수가 다른 함수를 호출하는 경우가 빈번한데요.
함수->함수->함수 이렇게 타고 들어가다 보면 정신을 못차리게 됩니다.
그런데 멀티쓰레드라면 이 함수들에서 Lock을 잡아야 
쓰레드 사이의 상호배타적 특성이 보장되겠죠.

만약 재귀적 락을 허용하지 않는 경우라면,
Lock을 잡는 버전의 함수에선 절대로 또 Lock을 잡는 함수를 중첩해서 호출하면 안 됩니다.
가령 저는 예전에 첫 포폴을 만들 때는
함수마다 ~Locked 이름을 붙여서 Lock을 잡는 함수인지 아닌지를 구별을 하곤 했습니다.
(ex. EnterRoomLocked, EnterRoom)

이렇게 구분해서 Locked 계열 함수에선
절대 Locked 계열 함수를 또 호출하면 안 된다!를 스스로 기억하면 되지만
실수의 여지가 많고 무척 귀찮은 일이 될겁니다.
만약 중첩 락을 허용하게 코드를 작업해주면,
이런 부분을 신경쓰지 않고 이미 만들어진 함수에서 다른 함수를 자유롭게 호출이 가능해집니다.


 아하 이해했습니다! 감사합니다!

(게임학전공)장지현님의 프로필 이미지
(게임학전공)장지현

작성한 질문수

질문하기