C# Rookiss Part4 ๊ฒ์์๋ฒ : AutoResetEvent
๐โโ๏ธEvent
์ฌ๊ธฐ์ ์ง์์ ์ปค๋๋ ๋ฒจ์ ์๋ ์ฆ, ์๋ ๊ด๋ฆฌ์์ ์๋ ์ง์์ผ๋ก ์ด๋ง์ด๋งํ๊ฒ ๋๋ฆผ
ํ์ง๋ง ์ฐ๋ ๋ ์ ์ฅ์์ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ 100ํผ ์๋ฌผ์ ๊ฐ ํ๋ฆด๋ ํ์ฅ์ค์ ๋ค์ด๊ฐ
๐ชAutoResetEvent
*ํจ๊ฒ์ดํธ!
- ๋ฌธ์ด ์๋์ผ๋ก ์ ๊ธด๋ค
- ์ฐจ๊ฐ ํ๋์ฉ ์ง๋๊ฐ๋ค
class Lock
{
// bool <= ์ปค๋
AutoResetEvent _available = new AutoResetEvent(true); // ํจ๊ฒ์ดํธ ์ฒซ๋ฌธ์ ์ฐ ์ํ(true)
public void Acquire()
{
_available.WaitOne(); // ์
์ฅ ์๋, ์๋์ ๋ฌธ๋ ๋ซ์์ค!
//_available.Reset(); // bool = false // WaitOne์ ํฌํจ๋์ด์๋ค
}
public void Release()
{
_available.Set(); // flag = true
}
}
AutoResetEvent _available = new AutoResetEvent(true);
์ ์ปค๋๋จ์ bool๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋จ
_available.WaitOne();
์ _available.Reset();
์ด ํฌํจ๋์ด ์๋ค
_available.Reset();
์ bool = false ๋ผ๋ ๋ป
๐ชManualResetEvent
๋ฌธ์ด ์๋์ผ๋ก ์ ๊ธด๋ค
๋ฌธ์ ๋ซ์ง์์ผ๋ฉด ๋ช๋์ ์ฐจ๋ ์ง์์ด๋ ์ง๋๊ฐ๋ค
class Lock
{
// bool <= ์ปค๋
ManualResetEvent _available = new ManualResetEvent(true);
public void Acquire()
{
_available.WaitOne(); // ์
์ฅ ์๋
_available.Reset(); // ๋ฌธ์ ๋ซ๋๋ค
}
public void Release()
{
_available.Set(); // ๋ฌธ์ ์ด์ด์ค๋ค
}
}
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง๋ฉด ๋ฌธ์์ด๊ณ ๋ซ๋ ๋ถ๋ถ์ด ์์์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ์๋จ
- ๋งค๋ด์ผ๋ฆฌ์
์ด๋ฒคํธ๊ฐ ํ์ํ ๋ถ๋ถ
- ๋ชจ๋ ๋ก๋ฉ์ด ๋๋๊ณ ์ฐ๋ ๋๋ฅผ ํ์ด์ฃผ๋ ๊ฒฝ์ฐ
ManualResetEvent(false);
๋ก ๋ฌธ์ ๋ซ์์ค- ๋ก๋ฉ์ด ๋๋๋ฉด _available.WaitOne(); // ์ ์ฅ ์๋๋ฅผ ํ ์ ๋ค์ด
- _available.Set(); // ๋ฌธ์ ์ด์ด์ฃผ๊ณ ์ฐ๋ ๋๋ค์ด ์ผ์ ์์
- ๋ชจ๋ ๋ก๋ฉ์ด ๋๋๊ณ ์ฐ๋ ๋๋ฅผ ํ์ด์ฃผ๋ ๊ฒฝ์ฐ
๐ชMutex
namespace ServerCore
{
class Program
{
static int _num = 0;
static Mutex _lock = new Mutex();
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
_lock.WaitOne();
_num++;
_lock.ReleaseMutex();
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
{
_lock.WaitOne();
_num--;
_lock.ReleaseMutex();
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(_num);
}
}
}
์ปค๋ ๋๊ธฐํ ๊ฐ์ฒด์ฌ์ ๋งค์ฐ ๋๋ฆผ
Mutex๋ ์ด๋ฒคํธ๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง!
- ๋ช๋ฒ ์ ๊ถ๋์ง ์นด์ดํ
- ThreadId๋ฅผ ๊ฐ์ง๊ณ ์์ด ์๋ฑํ ์ฐ๋ ๋๋ฅผ ๋ฆด๋ฆฌ์ฆ ํ์ง ์๊ฒ ํจ
AutoResetEvent, ManualResetEvent, Mutext ๋ชจ๋ ์ปค๋๋จ์์ ๋์!
๊ทธ๋์ ์ด๋ง์ด๋งํ๊ฒ ๋๋ฆฌ๋ค!!