• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

ReadLock 부분 질문입니다.

23.11.13 18:51 작성 조회수 183

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

그렇지 않습니다.

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

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

 

ji980207님의 프로필

ji980207

질문자

2023.11.14

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

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