• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

마지막 18:00분 질문

22.02.08 20:53 작성 조회수 152

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

네 물론 그런데요.

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

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

starkshn님의 프로필

starkshn

질문자

2022.02.09

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