본문 바로가기

hayee Study/코딩_c#

[C#] AutoResetEvent, ManualResetEvent 에 대하여

반응형

안녕하세요 hayee 입니다.

 

클라이언트 프로그램 소스 코드 분석 중 개념이 햇갈리는 부분이 있어서 다시 공부를 하였고, 글로 남겨놓으려고 합니다.


◈ 예제 소스 (1) - AutoResetEvent

 AutoResetEvent m_autoEvent = new AutoResetEvent(true);

private void btnCreate_Click(object sender, EventArgs e)
{
    for (int k = 0; k < 3; k++)
    {
        Thread th3 = new Thread(() => StartThread3());
        th3.Name = "Test thread " + k.ToString();
        th3.IsBackground = true;
        th3.Start();
    }
}

private void btnSet_Click(object sender, EventArgs e)
{
    m_autoEvent.Set();
}

private void StartThread3()
{
    Trace.WriteLine("thread3 (Name:" + Thread.CurrentThread.Name + ") 대기중");

    m_autoEvent.WaitOne();

    Trace.WriteLine("thread3 (Name:" + Thread.CurrentThread.Name + ") 신호 받음");
}

- AutoResetEvent(true): 초기 상태를 signal 상태로 만들어 주기 때문에, 스레드가 Block 상태에 있어도 (Waitone) 바로 다음으로 진행할 수 있다.

- AutoResetEvent(false): 초기 상태를 non-signal 상태 이기 때문에, 스레드가 Block 상태에 있으면 (Waitone) 신호를 줘야 (Set) 다음으로 진행할 수 있다.

 

[그림1 - AutoResetEvemt 예제 소스 결과]

- Create 버튼을 클릭하여 3개의 스레드를 생성한다. AutoResetEvent(true) 로 초기 상태를 설정하였기 때문에 스레드 생성 후 1개의 스레드만 Block 상태에서 나온 것을 확인할 수 있다.

(AutoResetEvent(false) 로 테스트 한 경우,  생성된 스레드 전부 Block 상태로 있게 된다.)

 

- Set 버튼을 클릭하면 나머지 Block 상태의 스레드 중 1개의 스레드만 Block 상태에서 나온것을 확인할 수 있다.

 

반응형

 

◈ 예제 소스 (2) - ManualResetEvent

 ManualResetEvent m_manualEvent = new ManualResetEvent(true);

private void btnCreate_manual_Click(object sender, EventArgs e)
{
    for (int k = 0; k < 3; k++)
    {
        Thread th4 = new Thread(() => StartThread4());
        th4.Name = "Test thread "+ k.ToString();
        th4.IsBackground = true;
        th4.Start();
    }
}

private void StartThread4()
{
    for (int i = 0; i < 2; i++)
    {
        Trace.WriteLine("thread4 (Name:" + Thread.CurrentThread.Name + ") 대기중");

        m_manualEvent.WaitOne();

        Trace.WriteLine("thread4 (Name:" + Thread.CurrentThread.Name + ") 신호 받음");

        Thread.Sleep(500);
        m_manualEvent.Reset();
    }
}

private void btnSet_manual_Click(object sender, EventArgs e)
{
    m_manualEvent.Set();
}

초기 신호 상태 설정은 AutoResetEvent 와 동일하지만 차이점이 있다.

ManualResetEvent 은 Block 상태를 빠져나온 뒤, 다시 Block 상태로 만들기 위해 수동으로 변경해 줘야 한다. (Reset())

 

또한 AutoResetEvent는 신호를 줄 때 1개의 스레드에만 적용이 되지만, ManualResetEvent 는 모든 스레드에 신호를 줄 수 있다는 것이다.

 

[그림2 - ManualResetEvemt 예제 소스 결과]

 

 

 

 

# 틀린 부분이 있다면 댓글 부탁드립니다. #

# 댓글 달아주시면 늦게라도 블로그 방문하도록 할게요! 감사합니다. #

 

 

 

728x90
반응형