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

카카누님의 프로필 이미지
카카누

작성한 질문수

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

메모리 배리어

메모리 배리어 질문

작성

·

233

0

질문이 있습니다.

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

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

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

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

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

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

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

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

a함수는_answer=123을 넣고

b함수는 _complete를 체크하면 

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

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

답변 3

2

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

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

1

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

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

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

0

카카누님의 프로필 이미지
카카누
질문자

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

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

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

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

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

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

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

카카누님의 프로필 이미지
카카누

작성한 질문수

질문하기