강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kakanu
kakanu

câu hỏi đã được viết

[Series Phát triển Game MMORPG với C# và Unity] Part4: Game Server

hàng rào bộ nhớ

메모리 배리어 질문

Viết

·

332

0

질문이 있습니다.

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

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

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

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

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

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

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

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

a함수는_answer=123을 넣고

b함수는 _complete를 체크하면 

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

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

unityC#network

Câu trả lời 3

2

Rookiss님의 프로필 이미지
Rookiss
Người chia sẻ kiến thức

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

1

Rookiss님의 프로필 이미지
Rookiss
Người chia sẻ kiến thức

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

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

0

kakanu님의 프로필 이미지
kakanu
Người đặt câu hỏi

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

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

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

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

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

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

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

Hình ảnh hồ sơ của kakanu
kakanu

câu hỏi đã được viết

Đặt câu hỏi