공부/게임 서버
[게임서버] 데드락(DeadLock)이란?
돌멩이수프
2022. 5. 26. 17:13
728x90
데드락을 한글로 풀면 교착상태이다. 두 개 이상의 프로세스가 있다. 모든 프로세스가 원하는 자원이 자신이 아닌 상대에게 있어 자원이 자신에게 오기만을 기다리느라 자원을 얻지 못하고 다음 차례로 넘어가지 못하는 상태가 계속 되는 것이다.
C#으로 작성된 내용입니다.
using System;
namespace ServerStudy
{
class Program
{
static object lock1 = new object();
static object lock2 = new object();
static void Test1()
{
lock (lock1)
{
Thread.Sleep(1000);
lock (lock2)
{
Console.WriteLine("Test1");
}
}
}
static void Test2()
{
lock (lock2)
{
Thread.Sleep(1000);
lock (lock1)
{
Console.WriteLine("Test2");
}
}
}
static void Main(string[] args)
{
Console.WriteLine("start...");
Task t1 = new Task(Test1);
Task t2 = new Task(Test2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine("finish");
}
}
}
예제를 실행시키면 Test1과 Test2 모두 실행되지 못하고 무한 대기 상태에 빠진다. 이를 해결하기 위해서는 두 스레드가 동시에 실행되지 않게 한다.
static void Main(string[] args)
{
Console.WriteLine("start...");
Task t1 = new Task(Test1);
Task t2 = new Task(Test2);
t1.Start();
Thread.Sleep(1000);
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine("finish");
}
t1.Start();와 t2.Start(); 사이에 1000밀리 초만큼의 차이를 두고 프로그램을 실행시킨다.
프로그램이 정상적으로 실행·종료됐다.
728x90