C#/C# 서버

[C#/서버] AutoResetEvent / ManualResetEvent

진서박 2023. 8. 20. 16:53
반응형

인프런 - Rookies님의 강의

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의

네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By Step! 🕹

www.inflearn.com

 

 

 

ResetEvent

커널에서 관리하는 bool값이라고 생각하면 된다.

 

 

 

사용법

인자로 InitialState(boolean)를 받음(초기 lock 상태)

AutoResetEvent _available = new AutoResetEvent(boolean 인자);

ManualResetEvent _available = new ManualResetEvent(boolean 인자);

 

AutoResetEvent 

lock을 잠그는 행동을 자동으로 해준다.

    class Lock
    {

        AutoResetEvent _available = new AutoResetEvent(true);

        public void Acquire()
        {
            _available.WaitOne();   // 입장 시도
            //_available.Reset();   // bool = false, WaitOne()에 포함되어 있어서 따로 사용 X
        }

        public void Release()
        {
            // 아까 잠근 lock 불리언을 true로 바꿔줌
            _available.Set();   // bool = true
        }
    }

 

ManualResetEvent 

자동으로 lock을 잠궈주지 않는다. 

=> Reset()으로 수동으로 잠궈주어야 하는데, 이러면 원자성이 지켜지지 않아 lock 구현에서는 사용하기 힘들다

그렇다면 언제 사용할까? -> 쓰레드를 한번에 하나씩만 사용해야 할 피룡가 없을 때 사용

        ManualResetEvent _available = new ManualResetEvent(true);

        public void Acquire()
        {
            _available.WaitOne();   // 입장 시도, 자동으로 안잠김
            _available.Reset();   // bool = false, 수동으로 잠금
        }

        public void Release()
        {
            // 아까 잠근 lock 불리언을 true로 바꿔줌
            _available.Set();   // bool = true
        }
반응형

'C# > C# 서버' 카테고리의 다른 글

[C#/서버] 기초 소켓 프로그래밍  (0) 2023.08.22
[C#/서버] ReaderWriterLock  (0) 2023.08.22
[C#/서버] SpinLock  (0) 2023.08.18
[C#/서버] 메모리 배리어  (0) 2023.08.16
[C#/서버] 캐시 이론  (0) 2023.08.16