작성
·
233
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
2번째 질문은 제가 질문을 잘못했네요
쓰레드가 동시에 실행된다고 하셨는데 그러면
A() 함수에서 _answer =123; 값을 넣고 _complete를 =true하기전에
B함수에서 if(_complete)를 검사하면 _complete는 아직 false이기 때문에
B함수에서 _answer값을 출력하지 못할수도 있는거 아닌가요?
그러면 while문으로 계속 true인지 계속 체크해야하는거 아닌가요?
예문을 실행하면 정상적으로 작동되긴한데 이해가 잘안가네요 설명 부탁드립니다.