Home 11강 데드락
Post
Cancel

11강 데드락

11강 데드락

데드락 발생 상황

스토리로 풀어보기

  1. 사람이 2명 있다
  2. 2명이 모두 자물쇠를 하나씩 가지고 있다
  3. 자물쇠가 2개 있고 이를 모두 획득해야 방에 들어갈 수 있다
  4. 서로의 자물쇠를 획득해야지만 하는 상황
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번째 스레드가 지연되어 실행되도록 한다
  • 데드락 상황이 일어나지 않고 잘 실행이 된다

+) 라이브 서비스 하는 게임에서 데드락 막는 것은 더더 어렵다

This post is licensed under CC BY 4.0 by the author.