반응형
데드락(Deadlock)은 두 개 이상의 스레드나 프로세스가 서로를 무한히 기다리는 상황을 말합니다.
각 스레드는 다른 스레드가 보유한 리소스를 기다리고 있으며,
그 리소스를 보유한 스레드 역시 다른 스레드가 보유한 리소스를 기다리고 있어서 아무도 진행할 수 없는 상태가 됩니다.
이런 상황은 시스템의 일부가 영원히 멈춰 있게 만들어, 리소스를 낭비하고 프로그램을 실패로 이끕니다.
데드락이 발생하는 주요 원인은 다음과 같습니다:
- 상호 배제(Mutual Exclusion): 한 번에 하나의 프로세스만 자원을 사용할 수 있습니다.
- 보유 및 대기(Hold and Wait): 프로세스가 자원을 보유한 상태에서 추가 자원을 기다립니다.
- 비선점(No Preemption): 자원이 강제로 빼앗길 수 없습니다.
- 순환 대기(Circular Wait): 프로세스의 집합 {P0, P1, ..., Pn}에서 P0은 P1이 보유한 자원을 기다리고, P1은 P2가 보유한 자원을 기다리며, ..., Pn은 P0이 보유한 자원을 기다립니다.
아래는 C#에서 데드락을 일으키는 예시 코드입니다:
using System;
using System.Threading;
class DeadlockExample
{
private static readonly object lock1 = new object();
private static readonly object lock2 = new object();
public static void Main()
{
Thread thread1 = new Thread(new ThreadStart(ThreadMethod1));
Thread thread2 = new Thread(new ThreadStart(ThreadMethod2));
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
}
static void ThreadMethod1()
{
lock (lock1)
{
Console.WriteLine("Thread 1 has acquired lock on lock1");
Thread.Sleep(1000); // 대기하여 데드락 가능성 증가
lock (lock2)
{
Console.WriteLine("Thread 1 has acquired lock on lock2");
}
}
}
static void ThreadMethod2()
{
lock (lock2)
{
Console.WriteLine("Thread 2 has acquired lock on lock2");
Thread.Sleep(1000); // 대기하여 데드락 가능성 증가
lock (lock1)
{
Console.WriteLine("Thread 2 has acquired lock on lock1");
}
}
}
}
이 코드에서는 두 개의 스레드(ThreadMethod1 및 ThreadMethod2)가 서로 다른 순서로
두 개의 잠금(lock1 및 lock2)을 획득하려고 시도합니다.
첫 번째 스레드가 lock1을 획득하고 두 번째 잠금을 기다리는 동안,
두 번째 스레드가 lock2를 획득하고 첫 번째 잠금을 기다립니다.
이로 인해 데드락이 발생하며, 어느 쪽도 진행할 수 없게 됩니다.
반응형
LIST
'멀티쓰레드 프로그래밍' 카테고리의 다른 글
Context Switching (0) | 2024.02.26 |
---|---|
SpinLock (0) | 2024.02.23 |
Locking (0) | 2024.02.23 |
Interlocked (0) | 2024.02.23 |
memory barrier (0) | 2024.02.23 |