• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

메모리 배리어 질문

21.07.22 15:34 작성 조회수 118

0

질문이 있습니다.

1. 코드가 원래 함수안에서 순차적으로 위에서 아래로 실행되는걸로 알고 있는데 멀티쓰레드 환경에서만 이러한 현상이 생기는 건가요?

 2. 쓰레드 실행순서에 궁금합니다.

그 두번째 예제에 쓰레드 t1 쓰레드 t2 를 만들고

t1.start() 먼저 시작하고  그 다음t2.start()하면   

쓰레드 t1이 A()함수 실행 다하고

쓰레드 t2가 B()함수를 실행하는 방식인가요? 

아님 동시에 실행되는 방식인가요?

만약 동시에 실행되면 꼬이지 않을까요?

a함수는_answer=123을 넣고

b함수는 _complete를 체크하면 

b함수는 _answer을 출력못하는데

제가 잘못 이해하고 있나요?

답변 3

·

답변을 작성해보세요.

2

네 물론 타이밍상 if (_complete)가 false라서 넘어가면 출력을 못할 수도 있습니다.
여기서 포인트는 설령 if (_complete)에 들어와서 Console.WriteLine까지 들어왔떠라도
놀랍게도 _answer 값이 123이 아닌 값으로 출력될 수 있다는 것입니다.
물론 이론적으로는 그렇긴 한데, 인텔이나 대부분의 환경에선 확인하기 힘듭니다.

1

1.
실제 실행 순서는 멀티쓰레드 여부와 무관하게 멋대로 바꿀 수 있습니다.
즉 여태껏 속고 사셨던 것이죠.
다만 그게 티가 안 났던 이유는, 아주 무모하게 막 바꾸진 않고
싱글쓰레드 기준으로 코드 로직을 뒤바꿔도 '티가 안 나는' 부분만 바꾸기 때문입니다.

2.
동시에 실행됩니다. 그게 멀티쓰레드의 묘미죠.
동시에 실행된다고 딱히 문제가 항상 일어나는 것은 아닙니다.
a 함수가 _answer=123를 넣는과 별개로
b는 헤당 메모리에 동시에 접근할 수 있으므로 아무런 문제가 없습니다.

0

카카누님의 프로필

카카누

질문자

2021.07.22

2번째 질문은 제가 질문을 잘못했네요

쓰레드가 동시에 실행된다고 하셨는데 그러면

A() 함수에서 _answer =123; 값을 넣고 _complete를 =true하기전에

B함수에서 if(_complete)를 검사하면 _complete는 아직 false이기 때문에

B함수에서 _answer값을 출력하지 못할수도 있는거 아닌가요?

그러면 while문으로 계속 true인지 계속 체크해야하는거 아닌가요?

예문을 실행하면 정상적으로 작동되긴한데 이해가 잘안가네요 설명 부탁드립니다.