공부/게임 서버

[게임서버] 상호배제 - Monitor.Enter, Monitor.Exit

돌멩이수프 2022. 5. 24. 16:15
728x90

직전 게시글에 쓴 Interlocked 외에도 원자성을 억지로 만들어줄 수 있는 기능이 있다. Monitor가 그것이다.

 

using System;

namespace ServerStudy
{
    class Program
    {
        static int number = 0;
        static object _lock = new object();

        static void Thread_1()
        {
            for (int i = 0; i < 100000; i++)
            {
                Monitor.Enter(_lock);
                number++;
                Monitor.Exit(_lock);
            }
        }
        static void Thread_2()
        {
            for (int i = 0; i < 100000; i++)
            {
                Monitor.Enter(_lock);
                number--;
                Monitor.Exit(_lock);
            }
        }

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

 

원자성을 보존하고 싶은 내용의 위 아래로 Monitor.Enter과 Monitor.Exit을 넣어주면 안에 내용이 다 실행되기 전에 다른 스레드가 실행되는 일이 없어진다. 이렇게 다른 스레드에서도 사용되는 number와 같은 공유 자원이 동시에 사용되는 것을 막기 위한 알고리즘을 상호배제라고 한다.

728x90