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

ji980207님의 프로필 이미지
ji980207

작성한 질문수

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

ReaderWriterLock 구현 연습

ReadLock 부분 질문입니다.

작성

·

253

0

 

public void ReadLock()
{
	while(true)
	{
		for(int i = 0 ; i < MAX_SPIN_COUNT; i++)
		{
			int expected = (_flag & READ_MASK);
			if(Interlocked.CompareExchange(ref _flag, expected + 1, expected) == expected))
				return;
		}
		Thread.Yield();
	}
}

해당 강의에서 작성해주신 ReadLock 부분 코드인데,

ReaderWriterLock에 경우 특정 쓰레드가 WriteLock을 잡고 있을 경우 ReadLock을 사용하지 못한다고 알려주셨는데

int expected = (_flag & READ_MASK)

위 코드는 Reader 부분만 긁어오니 Write를 잡고있는지 여부를 파악하지 않는데

위에

if(_flag & WRITE_MASK >> 16 == 0)

와 같은 Write를 잡고있는지 여부를 파악하는 조건문을 하나 추가해야하는 것 아닌가하는 의문이 남아 질문 남깁니다.

항상 좋은 강의 감사합니다.

답변 1

0

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

그렇지 않습니다.

if(Interlocked.CompareExchange(ref _flag, expected + 1, expected) == expected))

여기에 내포되어 있습니다. 오히려 if를 다시 한다면 그것은 원자적인 것이 아니게 됩니다.

 

ji980207님의 프로필 이미지
ji980207
질문자

제가 CompareExchange 메서드 동작을 헷갈렸습니다.

이해가 됐습니다. 답변 감사합니다.

ji980207님의 프로필 이미지
ji980207

작성한 질문수

질문하기