UnityServer - InterLocked

k_hyun·2022년 10월 26일
0

Unity_Server

목록 보기
5/32

코드

		static int number = 0;

        static void Thread_1()
        {
            for(int i=0; i<1000000; i++)
            {
                number++;
            }
        }

        static void Thread_2()
        {
            for (int i = 0; i < 1000000; i++)
            {
                number--;
            }
        }

        static void Main(string[] args)
        {
            Task t1 = new Task(Thread_1);
            Task t2 = new Task(Thread_2);

            t1.Start();
            t2.Start();

            Task.WaitAll(t1, t2);
            Console.WriteLine(number);
        }

각 쓰레드는 number의 값을 1씩 증가, 감소시키는 작업을 한다.

실행하면 우리가 기대하는 결과값은 0이 나와야 한다.

왜 위와 같은 값이 나올까?

Race Condition 때문이라 할 수 있다.

Race Condition

Race Condition이란 두 개 이상의 concurrent한 프로세스(혹은 스레드)들이 하나의 자원(리소스)에 접근하기 위해 경쟁하는 상태를 말한다.

출처: https://zangzangs.tistory.com/115 [장장스:티스토리]

number++;
=================
int tmp = number;
temp += 1;
number = temp

number++은 실제적으로 값을 불러오고 그 값을 증가시켜 다시 원래 주소에 저장하는 3단계를 거친다.

하지만 두개의 스레드가 동시에 작업하면 위의 세 작업은 뒤죽박죽으로 실행될 것이다.

따라서 우리가 원하는 결과가 나오지 않는다.

InterLocked

number++이 원하는 대로 작업하기 위해서는 세 단계가 atomic하게 일어나야 한다.

즉, 한번 값을 불러오면, 값을 다시 저장하기까지의 과정이 연속적으로 일어나야 한다.

도중에 다른 스레드에서 그 값에 접근하면 안 된다는 말이다.

위 함수를 통해 atomic하게 증가, 감소를 시킬 수 있다.

0개의 댓글