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
'공부 > 게임 서버' 카테고리의 다른 글
[게임 서버] 블로킹 / 논블로킹, 동기 / 비동기 (0) | 2022.06.02 |
---|---|
[게임서버] AutoResetEvent와 ManualResetEvent (0) | 2022.05.31 |
[게임서버] Context Switching이란? (Thread.Sleep(1), Thread.Sleep(0), Thread.Yield()) (0) | 2022.05.26 |
[게임서버] 스핀락(Spinlock)이란? (0) | 2022.05.25 |
[게임서버] 상호배제 - Monitor.Enter, Monitor.Exit (0) | 2022.05.24 |