강의

멘토링

커뮤니티

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

starkshn님의 프로필 이미지
starkshn

작성한 질문수

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

메모리 배리어

마지막 18:00분 질문

작성

·

262

2

 

 

위의 사진처럼 A, B가 멀티쓰레드 환경에서 실행이 된다고 가정을 하셨는데

A.Start();

B.Start();를 해주게 되면은

 

가시성 확보를 해주어서

A쓰레드는 

  _answer = 123;

            Thread.MemoryBarrier();

이렇게 하면 메모리에 _answer =123값이 올라가게 되고

 

그다음에  메모리 베리어로 물을 내리고(가시성확보)

 

그다음

 

_complete = true;

            Thread.MemoryBarrier();

의 작업을 해주게 되는데

 

B쓰레드의 경우

메먼저 메모리 베리어에서 가시성 확보를 위해(read를 하기위해) 메모리 베리어를 호출을 하고

 

if(_complete)로 읽어왔는데

 

멀티 쓰레드 환경이면 B는 실행을 하여도 A쓰레드에서 _complete를 true로 바꾸기전에 

같이 실행을 하면 B는 실행이 되지만 if문에 걸리지 않아 바로 종료를 하게 되지 않나요???

 

 

답변 1

2

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

네 물론 그런데요.

위 내용에서 핵심은 if (_complete) 가 true라서 
Console.WriteLine()이 실행되었음에도 출력되는 숫자가  123이 아닐 수 있다!!
~는 쇼킹한 사실에 있습니다.

물론 이론적으로 그렇긴 한데 우리가 사용하는 프로세서에서는
재현되지 않아 정말 이론적으로만 알고 넘어가면 됩니다.

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

아하 그렇군요 감사합니다~~

starkshn님의 프로필 이미지
starkshn

작성한 질문수

질문하기