-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
마지막 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문에 걸리지 않아 바로 종료를 하게 되지 않나요???
답변을 작성해보세요.
2
Rookiss
지식공유자2022.02.09
네 물론 그런데요.
위 내용에서 핵심은 if (_complete) 가 true라서
Console.WriteLine()이 실행되었음에도 출력되는 숫자가 123이 아닐 수 있다!!
~는 쇼킹한 사실에 있습니다.
물론 이론적으로 그렇긴 한데 우리가 사용하는 프로세서에서는
재현되지 않아 정말 이론적으로만 알고 넘어가면 됩니다.
답변 1