📄 Mutex
Mutex는 AutoResetEvent와 비슷하게 상호배제를 위한 기능으로 사용할 수 있습니다.
AutoResetEvent와 다르게 더 많은 정보를 내부에 지니고 있으며 예로 다중Lock을 하여 몇번 Lock을 했는지, 스레드ID를 가지고있어 자신을 Lock시킨 스레드를 알고, 추후에 다른 스레드에서 자신을 Release했는지 확인하여 잘못된 코드를 확인할 수 있는 기능을 지닙니다.
하지만 더 많은 정보를 가지고 있기에 보다 느리게 동작합니다.
📑 Mutex
namespace ServerCore
{
class Program
{
static int number = 0;
static Mutex _lock = new Mutex();
static void Thread1()
{
for(int i = 0; i < 100000; ++i)
{
_lock.WaitOne();
number++;
_lock.ReleaseMutex();
}
}
static void Thread2()
{
for (int i = 0; i < 100000; ++i)
{
_lock.WaitOne();
number--;
_lock.ReleaseMutex();
}
}
static void Main(string[] args)
{
Task task1 = new Task(Thread1);
Task task2 = new Task(Thread2);
task1.Start();
task2.Start();
Task.WaitAll(task1, task2);
//예상되는 출력은 0
Console.WriteLine(number);
}
}
}
- 예상한대로 값이 정상적으로 나온것을 확인할 수 있습니다.
- 하지만 결과가 나오는데까지 약 1초정도 걸렸으며, 매우 느린것을 확인할 수 있었습니다.
_lock.WaitOne();
_lock.ReleaseMutex();
- 락을 걸고, 릴리즈 하는 함수입니다.
- AutoResetEvent와 같게 하나의 스레드가 접근하면 락이 자동으로 걸리는 방식으로 동작합니다.
- 특정한 의도가 담긴 코드를 수행한 후 개발자가 ReleaseMutex를 해주면 락이 풀리게됩니다.
'server > socket server' 카테고리의 다른 글
[C# 서버] ReaderWriterLock 구현 (0) | 2023.01.11 |
---|---|
[C# 서버] ReaderWriterLock (0) | 2023.01.10 |
[C# 서버] AutoResetEvent (1) | 2023.01.06 |
[C# 서버] Context Switching (0) | 2023.01.04 |
[C# 서버] 스핀락 (0) | 2023.01.04 |