[C# 문법] C# Thread(스레드) ManualResetEvent 이용하여 신호대기 하기

안녕하세요.

 

오늘은 C# 문법에서 ManualResetEvent 사용 방법에 대해서 알려 드리려고 합니다.

 

C# 프로그래밍을 하면서 스레드를 여러 개 사용하다 보면, 종종 다른 어떤 스레드스 신호줄 때 까지 다른 스레드를 대기 상태로 두어야 할 때가 있는데요.

 

이런 상황에서 사용되는 수단이 바로 ManualResetEvent 입니다. 하나의 스레드에서 ManualResetEvent 객체에 대해 WaitOne을 호출하면, 그 스레드는 다른 스레드가 Set을 호출할 때까지 기다리게 되는데요.

 

이렇게 말로 설명을 드리면 당연히 이해하기 어렵다고 생각합니다. 그럼 바로 예제를 통해서 ManualResetEvent 를 사용해 보도록 하겠습니다.

 

예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Threading;
 
namespace ThreadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // ManualResetEvent 객체 필드
            var signal = new ManualResetEvent(false);
 
 
            for (int i = 0; i < 10; i++)
            {
                int temp = i;
 
                new Thread(() =>
                { 
                    Console.WriteLine($"{temp} 신호 대기");
 
                    //신호 대기
                    signal.WaitOne();
 
                    Console.WriteLine($"{temp} 번째 신호 받음!!!");
                }).Start();
            }
 
            //주 메인 스레드
            Thread.Sleep(2000);
 
            //신호 연다
            signal.Set();
        }
    }
}
 
cs

 

실행 결과

 

위와 같이, 10개의 스레드를 생성하였고 스레드에서의 작업 내용인 몇 번째 신호 대기중문구가 10개의 스레드에서 모두 출력이 되고, 바로 신호 받음이 뜨는 것이 아니라, 메인 스레드에서 2초의 대기 시간을 가진 후 ManualResetEvent 객체를 Set 해주고 나서야 10개의 스레드가 일제히 작업을 하여 몇 번째 신호 받음문구가 나란히 출력 되는 것을 확인하실 수 있습니다.

 

감사합니다.^^

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY