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

'공부 > 게임 서버' 카테고리의 다른 글

[게임 서버] 블로킹 / 논블로킹, 동기 / 비동기  (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
'공부/게임 서버' 카테고리의 다른 글
  • [게임 서버] 블로킹 / 논블로킹, 동기 / 비동기
  • [게임서버] AutoResetEvent와 ManualResetEvent
  • [게임서버] Context Switching이란? (Thread.Sleep(1), Thread.Sleep(0), Thread.Yield())
  • [게임서버] 스핀락(Spinlock)이란?
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (239)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C언어
    C
    EntityFramework
    unity
    네트워크
    Entityfamework
    디자인패턴
    C#
    Python
    코딩
    HTML
    라즈베리파이
    게임서버
    유니티
    백준
    java
    EFCore
    자바
    tcp
    coding
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[게임서버] 데드락(DeadLock)이란?
상단으로

티스토리툴바