작성
·
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
그렇지 않습니다.
if(Interlocked.CompareExchange(ref _flag, expected + 1, expected) == expected))
여기에 내포되어 있습니다. 오히려 if를 다시 한다면 그것은 원자적인 것이 아니게 됩니다.
제가 CompareExchange 메서드 동작을 헷갈렸습니다.
이해가 됐습니다. 답변 감사합니다.