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

우웅님의 프로필 이미지
우웅

작성한 질문수

Backend 멀티쓰레드 이해하고 통찰력 키우기

Read-Write Lock - 다 같이 읽는 건 괜찮지만 읽을 때 쓰면 안돼요

어떻게 상호배제가 이루어지는지 잘 이해가 안갑니다

해결된 질문

작성

·

309

1

 

private void Write()

{

// 다른 스레드가 읽기나 쓰는지 검증 ...

var request = DateTime.Now.ToString();

Interlocked.Increment(ref writeCount);

//...쓰기작업

}

03:40 부분의 내용입니다

스레드1 이 var request = DateTime.Now.ToString();

이 부분을 실행할때는 아직 writeCount 가 0인 상태인데

이때 스레드2가 writeCount와 readCount 0인거 확인하고

들어올 위험은 없는건가요? 어떻게 상호배제 되는지 이해가 안갑니다!

 

 

답변 2

1

모영철님의 프로필 이미지
모영철
지식공유자

수정된 코드도 문제가 있습니다. 의심하신 상황이 발생 할 수 있습니다.

Section7의 코드는 문제가 있고 Interlocked 클래스만 가지고 해결할 수 없습니다.

writeCount와 readCount의 비교와 변경이 Atomic Operation이어야 하기 때문에 반드시 lock이 필요합니다.

혼란을 드려 죄송합니다. ㅠㅠ

우웅님의 프로필 이미지
우웅
질문자

답변 감사합니다

조금 헷갈리지만 그래도 문제점을 발견해서 좋네요

 

0

모영철님의 프로필 이미지
모영철
지식공유자

죄송합니다. 코드가 완전히 잘못됐네요. 코드를 수정하여 github에 올렸습니다.

Interlocked.CompareExchange 함수를 사용하여 하나의 쓰레드만 Write를 하도록 수정하였습니다.

우웅님의 프로필 이미지
우웅
질문자

수정된 코드에 대한 질문입니다

 

read()

if (Volatile.Read(ref writeCount) > 0)

continue;

Interlocked.Increment(ref readCount);

수정된 코드 에서 read 일부 입니다

 

스레드1 이 write 하고 스레드2가 read 하고 있다고 가정할 때 스레드2가 먼저 writeCount 0 확인하고 Interlocked.Increment(ref readCount); 명령어 하기 직전에 스레드1이 writeCount 와 readCount 0임을 확인하고 write 작업 들어가면

write 작업하면서 read 작업도 동시에 돼서 문제가 될 가능성은 없나요?

 

우웅님의 프로필 이미지
우웅

작성한 질문수

질문하기