inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

SpinLock

원자성과 interlock연산의 관계에 대해서 질문입니다

265

한소림

작성한 질문수 7

0

<interlock 연산은 원자성을 가진다>는 것이 어떻게 <interlock 연산은 동시에 실행될 수 없다>를 설명해 줄 수 있는 것인지 잘 이해가 되지 않습니다.

예를 들어 스레드 1과 스레드 2가 Interlocked.Exchange(ref locked, 1)을 정확히 동시에 실행하면 문제가 발생할텐데, <interlock 연산은 _locked 변수에 +1 하는 연산을 분리될 수 없는 하나의 작업으로 만든다>는 것이 어떻게 이 상황을 막는데 도움을 줄 수 있다는 것인가요?

이러한 의문 때문에 interlock연산이 기존 연산을 단일 연산으로 만드는 것이 race condition을 해결하는데 왜 도움이 되는지 이해가 되지 않습니다

 

두번째 질문은 다음과 같습니다. interlock 연산의 동시 실행을 막는 기작은 lock을 이용한 것인가요?

C# network unity

답변 1

0

Rookiss

예를 들어 스레드 1과 스레드 2가 Interlocked.Exchange(ref locked, 1)을 정확히 동시에 실행하면 문제가 발생할텐데,

그렇지 않습니다. 동시에 실행해도
무조건 간발의 차이라도 하나가 먼저 실행되게 되는데
실제 어셈블리 명령어를 살펴보면 일반 mov가 아닌 lock XXX 형태로 만들어지기 때문입니다.
이것은 cpu 제조사들이 보장을 하는 특수 명령어이며
하드웨어 쪽으로 넘어가기 때문에 우리가 '이해'를 할 수 있는 영역이 아니라 그냥 받아들여야 합니다.

마찬가지로 C# 의 lock는 상호배타적 특성을 보장하긴 하지만,
어떻게 구현해야 하는지는 공식적인 스펙에 명시된 바 없습니다.
lock을 구현할 때 interlocked를 사용해도 되고 다른 방식을 사용한다고 안될 것은 없겠죠.
비슷한 예로 windows 환경의 critical section도 2000년 초반엔 안 그러다
어느 순간부터 스핀락 방식을 섞어서 사용하도록 수정되었습니다.

C#에서의 RAII

0

71

3

TLS 질문드립니다.

0

82

2

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

0

76

2

Unity Span

0

99

2

XML, Dll 차이점

0

134

2

Session 질문입니다

0

98

1

Write Read 커서 키워드

0

88

1

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

0

85

2

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

0

115

2

UnhandledException 으로 서버 터지는 경우

0

104

2

컨텐츠 단, 엔진 단

0

118

1

질문 있습니다

0

93

2

C# 게임서버 3D MMORPG

0

159

2

유니티6 버전

0

106

2

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

0

154

2

커서의 위치의 중요성

0

111

2

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

0

179

2

강의에 질문이 있습니다

0

94

2

멀티스레드 이해도 질문

0

108

1

500 vs 500

0

148

3

OnAcceptHandler 액션 함수

0

71

1

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

0

207

2

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

0

87

2

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

0

116

1