ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오토리셋이벤트(AutoResetEvent)
    게임서버/멀티쓰레드 프로그래밍 2022. 3. 11. 18:26

    1. 오토리셋이벤트 구현

        class Lock
        {
            // bool <- 커널
            AutoResetEvent _avaliable = new AutoResetEvent(true); // true면 톨게이트를 연 상태로 시작
            
            public void Acquire()
            {
                _avaliable.WaitOne(); // 입장 시도, flag = false로 만들어줌
            }
            public void Release()
            {
                _avaliable.Set(); // flag = true로 만들어줌
            }

    운영체제의 커널 단까지 들어가기 때문에 성능에서 매우 불리하다.

     

    2. 수동리셋이벤트(ManualResetEvent)

        class Lock
        {
            ManualResetEvent _avaliable = new ManualResetEvent(true); 
            
            public void Acquire()
            {
                _avaliable.WaitOne(); // 입장 시도( flag = false )
                _avaliable.Reset(); // flag = false로 만들어줌
            }
            public void Release()
            {
                _avaliable.Set(); // flag = true로 만들어줌
            }
        }

    그런데 수동리셋이벤트로 구현한걸 막상 실행해보면 또 꼬이는 현상이 발생하는데 그 이유는 옛날에 나왔었던 예제들과 같이 Acquire()내부가 여러줄의 코드로 이루어졌기 때문이다.

     

    3. 뮤텍스(Mutex)

        class Program
        {
            static int num = 0;
            static Mutex _lock = new Mutex();
    
            static void Thread_1()
            {
                for (int i = 0; i < 10000; i++)
                {
                    _lock.WaitOne();
                    num++;
                    _lock.ReleaseMutex();
                }
            }
        }

    오토리셋이벤트와는 대부분 비슷하지만 더 많은 정보들을 가지고 있다.

    먼저 쓰레드의 아이디를 가지고 있다. 다음으로는 락이 중첩 될 경우 해제도 그만큼 중첩으로 해야하는 경우가 있으므로 그러한 경우를 락의 횟수로 관리해준다.

    그러나 뮤텍스가 실제로 사용되는 경우는 많이 없으므로 이런게 있구나 정도로 알아두면 좋다.

     

    '게임서버 > 멀티쓰레드 프로그래밍' 카테고리의 다른 글

    ReaderWriterLock  (0) 2022.03.11
    컨텍스트 스위칭(Context Switching)  (0) 2022.03.11
    스핀락(SpinLock)  (0) 2022.03.11
    Lock 구현 이론  (0) 2022.03.11
    데드락  (0) 2022.03.10
Designed by Tistory.