inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Interlocked

컴파일러와 원자성에 대한 질문입니다

226

gustlr1221

작성한 질문수 2

0

원자성이 보존?이 안되서 100000번 더하고 뺀 결과가 0이 안나오는 사실은 이해했습니다. 근데 컴파일은 항상 위에서 아래로 진행된다고 알고있는데, Thread_1()에서 하는 일이 끝나기도 전에 Thread()2가 실행되는건가요? 이런식이면 사실상 원자성은 항상 보존되지 않으면  프로그램이 매번 꼬일거같은데, 제가 잘못생각하고있는 부분이 있나요?

network C# unity

답변 1

4

Rookiss

네 혼동하고 계신 부분이 몇가지가 있는데

1)
우선 컴파일러와 실제 실행은 아무런 상관이 없습니다.
컴파일은 C# 코드를 실행 가능한 결과물(bytecode)로 만들어내는 과정이고
이 때 위에서 아래로 훑으면서 결과물을 만드는 것은 맞지만,
그렇다고 실제 실행될 때 항상 그 순서가 지켜지는 것은 아닙니다.

2) 
Thread_1 끝나기도 전에 Thread_2가 실행될 수도 있고, 아닐 수도 있습니다.
서로 독립적이기 때문에 정해진 바는 없습니다.
지금까지는 항상 싱글쓰레드 프로그래밍만 하셨기 때문에
Thread_1(); Thread_2(); 이렇게 함수 2개를 호출했다면
Thread_1이 호출 완료되고, Thread_2가 호출된다. 라고 생각하셨겠지만
쓰레드는 그런 개념이 아니라 병렬로 실행하는 개념입니다.
같은 육체에 영혼이 다수 깃든 개념이랄까요?

t1.Start();과 t2.Start()를 하는 순간 프로그램이 하나 더 실행된다고 보시면 됩니다.
그러면 Main을 실행하는 애 하나, t1 실행하는 애 하나, t2 실행하는 애 하나.
이렇게 최대 3개의 쓰레드(영혼)이 동시 작업하는 셈이 되는거죠.

3.
원자성에 대한 얘기는 항상 문제가 일어나는게 아니라
[멀티쓰레드] 환경에서 [동시에 작업하는 데이터] 한해서 문제가 됩니다.
내가 건드리는 데이터를 다른 애도 같이 건드릴 수 있기 때문에 문제가 되는 겁니다.
일반적인 싱글쓰레드 환경에서는 어차피
나 말고 해당 데이터를 건드리는 애가 없기 때문에
해당 쓰레드가 자신의 페이스대로 천천히 데이터를 수정하고 갖고 놀아도 무방합니다.

TLS 질문드립니다.

0

35

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

39

2

Unity Span

0

66

2

XML, Dll 차이점

0

99

2

Session 질문입니다

0

74

1

Write Read 커서 키워드

0

69

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

65

2

네트워크 Send 전담 스레드 배치

0

94

2

UnhandledException 으로 서버 터지는 경우

0

82

2

컨텐츠 단, 엔진 단

0

100

1

질문 있습니다

0

73

2

C# 게임서버 3D MMORPG

0

141

2

유니티6 버전

0

94

2

receive하는 부분과 send하는 부분의 차이

0

128

2

커서의 위치의 중요성

0

99

2

C++ 전혀 모르는데 C# 서버

0

164

2

강의에 질문이 있습니다

0

83

2

멀티스레드 이해도 질문

0

90

1

500 vs 500

0

122

3

OnAcceptHandler 액션 함수

0

57

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

185

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

78

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

100

1

스핀락 질문.

0

104

2