UnityServer - Lock

k_hyun·2022년 10월 26일
0

Unity_Server

목록 보기
6/32

코드

static int number = 0;
static object _obj = new object();
        static void Thread_1()
        {
            for(int i=0; i<1000000; i++)
            {
                Monitor.Enter(_obj);
                number++;
                Monitor.Exit(_obj);
            }
        }
        static void Thread_2()
        {
            for (int i = 0; i < 1000000; i++)
            {
                Monitor.Enter(_obj);
                number--;
                Monitor.Exit(_obj);
            }
        }

Thread 1,2에서는 number에 대한 연산을 처리 전, 후에 Monitor 함수를 넣어준다.

Monitor.Enter의 경우 화장실을 닫는 행위, Monitor.Exit의 경우 화장실 문을 여는 행위로 생각하면 쉽다.

닫혀 있는 경우에는 다른 스레드에서 화장실에 들어 갈 수 없으므로 스레드가 진행이 되지 않는다.

        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);
        }
    }


잘 작동함을 확인할 수 있다.

임계 영역

임계 구역(critical section) 또는 공유변수 영역은 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다.

위의 상황에서는 number가 그렇게 되겠다.

lock

Monitor.Enter(_obj);
number++;
Monitor.Exit(_obj);

===============================

lock(_obj)
{
	number++;
}

lock을 사용하여 아래와 같은 코드로 변경해도 똑같은 결과가 나온다.

_obj에 대하여 lock이 걸려 있지 않으면 아래의 코드를 실행하고 lock을 해제한다.

반면 이미 lock이 걸려있는 경우에는 스레드가 진행되지 않게 된다.

0개의 댓글