강의

멘토링

로드맵

Inflearn Community Q&A

derekop20002437's profile image
derekop20002437

asked

Understand and gain insight into backend multithreading

Read-Write Lock - It's okay to read together, but you can't use it while reading.

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

Resolved

Written on

·

394

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인거 확인하고

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

 

 

C#mysqlkafkaredismultithread

Answer 2

1

captainmomo님의 프로필 이미지
captainmomo
Instructor

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

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

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

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

derekop20002437님의 프로필 이미지
derekop20002437
Questioner

답변 감사합니다

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

 

0

captainmomo님의 프로필 이미지
captainmomo
Instructor

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

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

derekop20002437님의 프로필 이미지
derekop20002437
Questioner

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

 

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 작업도 동시에 돼서 문제가 될 가능성은 없나요?

 

derekop20002437's profile image
derekop20002437

asked

Ask a question