2012-08-12 2 views
0

I 잠금 트리 교착 상태 감지 알고리즘의 몇 가지 예에 노력하고 교착이 특정 상황에서 발생하는 방법을 알아낼 수 없었다 봤는데 : 내이 잠금을 이해에서잠금 트리 알고리즘의 교착 상태 감지

Thread 1:   Thread 2: 

lock(A)    lock(E) 
lock(C)    lock(D) 
unlock(C)   unlock(D) 
lock(B)    unlock(A) 
lock(D)    lock(A) 
lock(E)    lock(C) 
unlock(E)   unlock(C) 
unlock(D)   unlock(A) 
unlock(B) 
unlock(A) 

을 스레드가 반대 순서로 그 잠금을 가지고 있기 때문에, D - E : E 및 T2 - D :

T1:   T2: 
      /\ 
    A   E A 
/\   | | 
C B  D C 
    | 
    D 
    | 
    E 

이는 교착 상태가 노드 T1에서 발생 될 수 있을까요 : 나무의 모양은?

어떻게 교착 상태를 제거하기 위해 하나의 잠금 및 잠금 해제 문을 삽입 할 것을 제안 할 수 있습니까?

답변

0

스레드 1 않는다 : 로크 (a), 로크 (c), (c) 잠금, 잠금 (b) A, B 및 D가 잠겨

스레드 이제 로크 (d) 이렇게

로크 (E), 로크 (d)

는 이제 예를도 잠겨 스레드 2 해주기

해제 한 깨어나서 않는 스레드하는 D 기다리고 : 2 않는 로크 (E)

이제 막혀 있습니다 -

1은 e를 잠금 해제하기 위해 2를 기다리고 있습니다.

2는 별도의 작업이 한 번에 필요한 모든 것을 잠그는 것입니다 피하기 위해 D에게 방법의

하나의 잠금을 해제 한 대기하고 있지 않습니다.

+0

아, 이제 알겠습니다! 고맙습니다. 그래도 한 가지 추가 질문이 있습니다. T2 : ** lock (b) **, lock (e), lock (d)을 추가하면 발생하는 교착 상태를 피할 수 있습니까? 아마도 – Maputo

+0

입니다. 어려운 부분은 교착 상태를 피하기위한 것이 아니라 교착 상태를 피하면서 스레드가 병렬로 실행되도록하는 것입니다. 다른 방법으로는 스레드 2가 완료 될 때까지 스레드 1을 생성시에 잠글 수 있습니다 – Gir

0

예, T2에서 잠금 (E) 전에 잠금 (B)으로 인해 교착 상태가 발생하지 않습니다. 이를 게이트 잠금이라고합니다.