메모리 배리어 질문
335
投稿した質問数 24
질문이 있습니다.
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
2번째 질문은 제가 질문을 잘못했네요
쓰레드가 동시에 실행된다고 하셨는데 그러면
A() 함수에서 _answer =123; 값을 넣고 _complete를 =true하기전에
B함수에서 if(_complete)를 검사하면 _complete는 아직 false이기 때문에
B함수에서 _answer값을 출력하지 못할수도 있는거 아닌가요?
그러면 while문으로 계속 true인지 계속 체크해야하는거 아닌가요?
예문을 실행하면 정상적으로 작동되긴한데 이해가 잘안가네요 설명 부탁드립니다.
TLS 질문드립니다.
0
39
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
45
2
Unity Span
0
72
2
XML, Dll 차이점
0
103
2
Session 질문입니다
0
78
1
Write Read 커서 키워드
0
72
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
68
2
네트워크 Send 전담 스레드 배치
0
97
2
UnhandledException 으로 서버 터지는 경우
0
84
2
컨텐츠 단, 엔진 단
0
103
1
질문 있습니다
0
76
2
C# 게임서버 3D MMORPG
0
143
2
유니티6 버전
0
96
2
receive하는 부분과 send하는 부분의 차이
0
132
2
커서의 위치의 중요성
0
102
2
C++ 전혀 모르는데 C# 서버
0
169
2
강의에 질문이 있습니다
0
85
2
멀티스레드 이해도 질문
0
94
1
500 vs 500
0
127
3
OnAcceptHandler 액션 함수
0
60
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
187
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
81
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
104
1
스핀락 질문.
0
109
2

