• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

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

22.09.04 02:46 작성 조회수 148

0

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

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

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

 

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

답변 1

답변을 작성해보세요.

0

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

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

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