(C# : Server) 8. DeadLock

Posted by : at

Category : Charp-Server


두 쓰레드가 락을 잡고 서로 락이 풀리기를 대기한다면??? -> 또 다른 데드락이 발생

class SessionManager
{
    // 클래스 각각 자신의 lock이 있다고 가정하자
    static object _lock = new object();

    public static void Test()
    {
        lock(_lock)
        {
            // 내가 lock을 잡은 상태로 다른 클래스의 lock잡는 함수를 호출
            UserManager.TestUser();
        }
    }

    public static void TestSession()
    {
        lock(_lock)
        {

        }
    }

    // ...
}

class UserManager
{
    static object _lock = new object();

    public static void Test()
    {
        lock(_lock)
        {
            SessionManager.TestSession();
        }
    }

    public static void TestUser()
    {
        lock(_lock)
        {

        }
    }

    // ...
}

// 여기서 주의할 점은 Thread의 타이밍이 조금만 어긋나도 이러한 데드락은 발생하지 않는다
// 오히려 이런 부분이 데드락을 잡기를 어렵게 하는 부분이다.
static void Thread_1()
{
    for(int i = 0; i < 100000; i++)
    {
        SessionManager.Test();
    }
}

static void Thread_2()
{
    for(int i = 0; i < 100000; i++)
    {
        UserManager.Test();
    }
}

해결방법이 있나??
사실 일정시간을 대기하다가 lock을 못잡을 시 알려주는 코드가 있지만
위험을 피해가는 것이 불과하다.

오히려 이런 데드락이 발생하면 lock을 순서를 바꾸는 방향으로 해결하는게 나음. 따라서 데드락이 발견되고 해결하는 방향이 옳을 수 있음(미리 예방이 거의 불가능하다)


About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links