공부/게임 서버

[게임서버] 데드락(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