[교육동영상]C# 쓰레드(Thread), AutoResetEvent, ManualResetEvent, WaitOne, Set, Reset, C#학원, 닷넷학원, C#교육, WPF교육, WPF학원
https://www.youtube.com/watch?v=D0siTPkCx3M&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=30

http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=427
ojc.asia
https://www.youtube.com/watch?v=0W2_2lKib-I&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=29


C# Thread
AutoResetEvent, ManualResetEvent
WaitOne, Set, Reset
C# 멀티 쓰레드(AutoResetEvent, ManualResetEvent)
System.Threading.AutoResetEvent, System.Threading.ManualResetEvent는 WaitOne으로 대기중인 쓰레드에게 신호를 보내 대기중인 여러 쓰레드에서 하나의 쓰레드만 실행을 허용하고다른 쓰레드들은 기다리게 할 수 있다. 마치 건널목의 차단기와 같이 차들이 WaitOne으로 대기하고, Set 신호를 보내면 차단기가 올라가고, 차가 통과 후 다시 Reset 신호를 보내면 차단기가 내려가는 구조를 가진다.
하나의 쓰레드가 AutoResetEvent 객체의 WaitOne() 메소드를 호출하여 대기하고 있다가 다른 쓰레드에서 이 AutoResetEvent, ManualResetEvent의 Set() 메소드를 호출해주면 대기 상태를 해제하고 계속해서 다음 문장을 실행할 수 있는데, 두 클래스의 차이는 AutoResetEvent는 자동으로, ManualResetEvent는 수동으로 Reset 한다.
AutoResetEvent는 차단기가 올라간 후 쓰레드 하나 실행 후 자동으로 다시 차단기가 다시 내려오고, ManualResetEvent는 자동으로 내려오지 않아 모든 쓰레드가 실행을 하게된다. 그러므로 WaitOne의 상태가 Set으로 풀린 이후 다시 차단기를 내리는 Reset을 천천히 수행하려면 ManualResetEvent 클래스를 사용하면 된다.
두 클래스의 생성자에 인자를 주면서 생성하는데 true이면 차단기가 올라간 상태, false이면 차단기가 내려간 상태에서 시작한다. 두 클래스의 차이점은 WaitOne의 상태가 Set으로 풀린 이후 Reset을 수동으로 하느냐 자동으로 하느냐에 있다.
ManualResetEvent는 하나의 쓰레드만 통과시키고 닫는 AutoResetEvent와 달리 한번 열리면 대기중이던 모든 쓰레드를 실행하게 하고 코드에서 수동으로 Reset()을 호출하여 문을 닫고 이후 도착한 쓰레드들을 다시 대기 하도록 한다.
using System;
using System.Threading;
public class ThreadTest2
{
bool sleep = false;
//차단기가 내려간 상태
static AutoResetEvent autoEvent = new AutoResetEvent(false);
public void FirstWork()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Console.WriteLine(Thread.CurrentThread.Name + " : {0}", i);
if (i == 5)
{
sleep = true;
Console.WriteLine("");
Console.WriteLine(Thread.CurrentThread.Name + " Thread 쉼...");
autoEvent.WaitOne();
}
}
}
public static void Main()
{
ThreadTest2 t = new ThreadTest2();
Thread first = new Thread(new ThreadStart(t.FirstWork));
first.Name = "First";
Thread second = new Thread(new ThreadStart(t.FirstWork));
second.Name = "Second";
first.Start(); second.Start();
while (t.sleep == false) { }
Console.WriteLine("2초후 Thread 깨웁니다.");
Thread.Sleep(2000);
autoEvent.Set(); // 차단기 올림, first, second중 하나만 깸
}
}
Second : 0
First : 0
First : 1
Second : 1
First : 2
Second : 2
Second : 3
First : 3
First : 4
Second : 4
Second : 5
Second Thread 쉼...
2초후 Thread 깨웁니다.
First : 5
First Thread 쉼...
Second : 6
Second : 7
Second : 8
Second : 9
AutoResetEvent는 자동으로 Reset되어 차단기가 내려와 처음 쓰레드 하나만 실행된다.
ManualResetEvent는 자동으로 차단되지 않아 차단기는 계속열려있다. 그래서 모든 쓰레드가 통과하여 실행된다.
using System;
using System.Threading;
public class ThreadTest2
{
bool sleep = false;
//차단기가 내려간 상태
static ManualResetEvent autoEvent = new ManualResetEvent(false);
public void FirstWork()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Console.WriteLine(Thread.CurrentThread.Name + " : {0}", i);
if (i == 5)
{
sleep = true;
Console.WriteLine("");
Console.WriteLine(Thread.CurrentThread.Name + " Thread 쉼...");
autoEvent.WaitOne();
}
}
}
public static void Main()
{
ThreadTest2 t = new ThreadTest2();
Thread first = new Thread(new ThreadStart(t.FirstWork));
first.Name = "First";
Thread second = new Thread(new ThreadStart(t.FirstWork));
second.Name = "Second";
first.Start(); second.Start();
while (t.sleep == false) { }
Console.WriteLine("2초후 Thread 깨웁니다.");
Thread.Sleep(2000);
autoEvent.Set(); // 차단기 올림, first, second중 하나만 깸
}
}
Second : 0
First : 0
Second : 1
First : 1
First : 2
Second : 2
First : 3
Second : 3
First : 4
Second : 4
Second : 5
Second Thread 쉼...
2초후 Thread 깨웁니다.
First : 5
First Thread 쉼...
First : 6
Second : 6
First : 7
Second : 7
First : 8
Second : 8
First : 9
Second : 9
#쓰레드, #Thread, #AutoResetEvent, #ManualResetEvent, #WaitOne, #Set, #Reset, #시샵교육, #닷넷교육, #시샵동영상, #닷넷동영상, 쓰레드, Thread, AutoResetEvent, ManualResetEvent, WaitOne, Set, #Reset, 시샵교육, 닷넷교육, 시샵동영상, 닷넷동영상,