11강 데드락
데드락 발생 상황
스토리로 풀어보기
- 사람이 2명 있다
- 2명이 모두 자물쇠를 하나씩 가지고 있다
- 자물쇠가 2개 있고 이를 모두 획득해야 방에 들어갈 수 있다
- 서로의 자물쇠를 획득해야지만 하는 상황
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class SessionManager{
static object lock_ = new object();
void TestSession(){
lock(lock_){}
}
void Test(){
lock(lock_){}
}
}
class UserManger{
static object lock_ = new object();
void Test(){
lock(lock_){
TestSession();
}
}
//...(생략)
}
- 서로 락을 획득하려고 하는 상황임
Monitor.Transfer()
⇒ 실패처리하는 코드
데드락 상황의 해결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args){
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
//====
Thread.Sleep(100);
t2.Start();
//====
Task.WaitAll(t1,t2);
}
- 정말 조금의 (0.1초…)시간 차를 두어서 2번째 스레드가 지연되어 실행되도록 한다
- 데드락 상황이 일어나지 않고 잘 실행이 된다
+) 라이브 서비스 하는 게임에서 데드락 막는 것은 더더 어렵다