C# Rookiss Part4 게임서버 : Lock기초
🙇♀️Lock 기초
동시 다발적으로 접근하면 문제가 되는 코드 : 임계영역
임계영역을 해결하기위한 Lock!
상호 배제적이다
🪐Monitor
문을 잠그고 일련의 행위를 한후 문을 풀어준다는 개념
문을 잠근뒤에는 싱글쓰레드로 생각해서 코딩하면 됨
문을 풀어주는 것이 인셉션, 실수 등으로 못할경우 문제가 됨 - 데드락 (DeadLock)
static int number = 0;
static object _obj = new object();
static void Thread_1()
{
// atomic = 원자성
for (int i = 0; i < 100000; i++)
{
// 상호배제 Mutual Exclusive
// 윈도우 : CriticalSection, c++ : std::mutex
Monitor.Enter(_obj); // 문을 감구는 행위
number++;
Monitor.Exit(_obj); // 잠금을 풀어준다
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
{
Monitor.Enter(_obj);
number--;
Monitor.Exit(_obj);
}
}
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(number);
}
각 언어마다 잠그고 풀어주는 역할을 하는 애들이 존재
- window - CriticalSection , c++ - std::mutex
🪐Lock
Monitor.Enter와 Monitor.Exit를 자동적으로 해주는 개념
_obj가 자물쇠 역할을 함
for (int i = 0; i < 100000; i++)
{
lock (_obj)
{
number++;
}
}