-
오토리셋이벤트(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