AutoResetEvent, ManualResetEvent 비교 및 간단 실습예제

FSP 0 63 09.15 16:22

AutoResetEvent, ManualResetEvent 비교 및 간단 실습예제


System.Threading.AutoResetEvent, System.Threading.ManualResetEvent는 쓰레드에게 신호를 보내 하나의 쓰레드만 실행을 허용하고다른 쓰레드들은 기다리게 할 수 있다하나의 쓰레드가 AutoResetEvent 객체의 WaitOne() 메소드를 호출하여 대기하고 있다가 다른 쓰레드에서 이 AutoResetEvent Set() 메소드를 호출해주면 대기 상태를 해제하고 계속해서 다음 문장을 실행할 수 있다.

 

System.Threading.AutoResetEvent, System.Threading.ManualResetEvent는 마치 건널목의 차단기와 같이 신호를 보내면 차단기가 올라가고(Set), 다른신호(Reset)를 보내면 차단기가 내려간다차가 차단기 앞에 도착했다면(WautOne으로 대기신호 상태에 따라 동작하게 된다.

 

 

  

두 클래스의 생성자에 인자를 주면서 생성하는데 true이면 차단기가 올라간 상태, false이면 차단기가 내려간 상태에서 시작한다. 두 클래스의 차이점은 WaitOne의 상태가 Set으로 풀린 이후 Reset을 수동으로 하느냐 자동으로 하느냐에 있다그러므로 WaitOne의 상태가 Set으로 풀린 이후 Reset을 다른일을 하고 천천히 수행하려면 ManualResetEvent 클래스를 사용하면 된다System.Threading.AutoResetEvent는 WaitOne의 상태가 Set으로 풀린 이후 이후 자동으로 Reset 된다.

 

 

AutoResetEvent는 자동 Reset을 하므로 사용자의 여러 개의 스레드 실행하면 하나의 스레드가 끝날 때까지 기다렸다가 대기하고하나의 스레드가 끝나면 다음 스레드가 실행되고 ManualResetEvent는 자동 Reset을 수동으로 해야 하므로 한번 Set되면 차단기가 곗ㅗㄱ 내려가 있어서 여러 개의 스레드가 한번에 실행된다.

 

 

 

 

using System;

using System.Threading;

 

namespace EvnetWaitHandleSample

{

    class Program

    {

        private static int count = 0;

        public static EventWaitHandle _waitHandle;

 

        static void Main(string[] args)

        {

            Console.Write("1:AutoResetEvent\n2:ManualResetEvent\n..................");

            switch (Console.ReadKey().KeyChar)

            {

                case '1':

                    //차단기 올라간 상태

                    _waitHandle = new AutoResetEvent(true);

                    break;

                case '2':

                    _waitHandle = new ManualResetEvent(true);

                    break;

            }

            Console.WriteLine("");

 

            Thread T1 = new Thread(new ThreadStart(DoWork));

            Thread T2 = new Thread(new ThreadStart(DoWork));

 

            T1.Start();

            T2.Start();

        }

 

        static private void DoWork()

        {

            _waitHandle.WaitOne();

            for (int i = 0; i < 5; i++)

            {

                Console.WriteLine(count++);

                Thread.Sleep(500);

            }

            // 이부분에서 AutoResetEvent는 자동으로 Reset되어 차단기가 내려옴

            // ManualResetEvent는 자동으로 차단되지 않아 차단기는 계속열려있다.

            // 그래서 모든 쓰레드가 통과하여 실행된다.

        }

    }

}

Comments