C# Interlocked 질문 드립니다.

조회수 1893회

안녕하세요~

c# 코드를 보던중에 Interlocked를 사용하는 부분이 나오는데 검색해보면 기계어랑 1:1 지원이 되는 명령으로

CompareExchange : 두 대상을 비교하여 값이 같으면 지정된 값을 설정하고, 그렇지 않으면 연산을 수행하지 않는다.

Decrement : 지정된 변수의 값을 감소시키고 저장한다.

Exchange : 변수를 지정된 값으로 설정한다.

Increment : 지정된 변수의 값을 증가시키고 저장한다.

라고 나오는데 이해가 안가서 좀 더 자세한 설명이 있었으면 합니다. 예를 들어 Increment 같은 경우에는 지정된 변수가 어떤 변수를 얘기하는 거며 증가했을 때 어떤 역할을 하게 되나요?

답변 부탁드리겠습니다. (__)

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 현재 그럭저럭 이해한게 멀티스레드에서 스레드간의 사용되는 int 나 long 타입의 전역변수의 값을 더하거나 감소 변경 비교 할때 사용하는걸로 보이는데 맞는건가요? 알 수 없는 사용자 2016.12.22 14:23

1 답변

  • 멀티스레드 환경을 먼저 이해할필요가 있습니다.

    CPU를 시간을 매우 잘게 쪼개어 나누어, 여러개의 스레드가 같은 CPU를 나누어 쓸수 있도록 하여, 멀티스레드를 구현합니다. (CPU가 여러개이더라도, 동시에 쓸수 있는 CPU 자원은 한정되기 때문에, 특정 CPU만 놓고 보면 나눠써야 합니다.)

    여기에서,

    어떤 시점에서 특정 스레드만 놓고 보면,

    • 스레다가 CPU를 점유하고 어떤 계산을 하고 있는 데,
    • CPU 점유시간이 만료됩니다.
    • 마지막으로 실행중이던 기계어만 실행되고, 남은 명령어는 실행중단하고, 다른 스레드가 CPU를 점유하게 됩니다.

    문제는 우리가 생각하는 i = i + 1 과 같은 명령이 실제로 기계어 수준에서 한개의 명령어로 구성되어 있지 않습니다.

    • 그리고 여러 개의 기계어로 구성된다면, 중간에 얼마든지 중단하고 다른 스레드로 갈 수 있습니다.

    두 개의 스레드에서 i라는 변수를 공유하고 있을 때, i의 값의 변화를 보장해주어야 할 때가 있습니다. 즉 i값을 변경하는 중에는 스레드 전환이 일어나지 해야한다는 의미입니다.

    이를 구현해놓은 것이 Interlocked라고 생각하시면됩니다. Compare, Increment, Decrement 의 각 함수는 멀티스레드 환경에서 값이 비교, 변경이 스레드 전환에 대해 안전한 것입니다. 스레드간의 공유하는 변수일 때가 아니라면 사용하지 않아도 됩니다.

    • 그렇군요. 답변 감사합니다. 그러면 멀티스레드에서는 공유되는 변수가 int나 long 형뿐인가요? Increment의 경우는 공유되는 값을 증가 시키는게 맞는건가요? 뭘 증가 시킨다는건지가 궁금 하네요 ㅎㅎ 알 수 없는 사용자 2016.12.26 16:27

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)