2013-12-11 2 views
0

...교착 상태에 도달 할 수 있습니까? 내가 작품을 교착 방법을 알아 내려고 고군분투

public void withdraw(double amount) { 
    balanceChangeLock.lock(); 
    try { 
     while (balance < amount) {} // wait balance to grow ... 
     double nb = balance - amount; 
     balance = nb; 
    } finally { 
     balanceChangeLock.unlock(); 
} 
} 

편집 : 더 많은 코드는 내가

public void deposit(double amount){ 
    balanceChangeLock.lock(); 
    try{ 
    balance = balance + amount; 
    } finally { 
    balanceChangeLock.unlock(); 
} 
} 

가이 코드로 교착 상태에 도달하는 것이 가능

을 왼쪽?

나는 마지막이 있고 이것은 내가 검토하고있어 선생님의 노트에 있고 나는

+0

잔액이 어떻게 달라지는가에 따라 다릅니다. –

+0

이것은 숙제로 의심스러워 보입니다. 실제로 프로그램에서 교착 상태에 빠져 있습니까? 자물쇠와 관련된 프로그램을 작성하고 있습니까? http://en.wikipedia.org/wiki/Deadlock – Jason

+0

과 balanceChangeLock이 잠겨있는 동안 그 크기가 커질 수 있는지 여부를 읽어보십시오. –

답변

0

예, 교착 상태가 여기에 발생할 수있는 이해 매우 해달라고, 숙제를하지 않습니다. 여기

는 호출을 교착

  1. withdraw을 야기 실행의 가능한 흐름이고, 잔액이 양 무승부에 충분하지 않다. 따라서 코드는 while 루프에 있으며 잠금을 유지합니다.
  2. deposit이 호출되어 balanceChangeLock을 잠그려고하지만 withdraw에 잠금이 설정되어 있기 때문에 불가능합니다. 그래서 기다립니다.

이제 withdraw은 입금을 기다리고 deposit은 잠금 해제를 기다리고 있습니다. 코드는 스레드에서 계속되지 않고 교착 상태에 빠져 있습니다.

+0

따옴표 Wikipedia 교착 상태 : "교착 상태는 둘 이상의 경쟁 동작이 각각 상대방이 완료 될 때까지 기다리는 상황이므로 절대 수행하지 않습니다." 'deposit'은'withdraw'로 잠금을 해제하고'withdraw'는'deposit'으로 입금을 기다리고 있기 때문에 이것은 교착 상태입니다. 교착 상태를 피하기 위해'withdraw'는 입금을 기다리는 while 루프에 들어가기 전에 잠금을 해제해야합니다. – Jason

+0

위키피디아 정의가 너무 광범위합니다. 예를 들어, 이와 같은 스핀 루프를 다룹니다. 적절한 정의를 위해서는 둘 이상의 프로세스와 두 개 이상의 자원이 필요합니다. – EJP

+0

@EJP, "교착 상태"에 대한 적절한 정의에 대한 링크를 제공합니까? 위키 피 디아 (Wikipedia)는 스핀 락 (spin lock)에 대해 "반복적으로 대기 ("스핀 ")하면서 잠글 때 반복적으로 락을 사용할 수 있는지 확인합니다." OP 코드는 while 루프에서 잠금을 사용할 수 있는지 검사하지 않고, 조건이 발생했는지 여부를 확인합니다. Wikipedia가 교착 상태 및 스핀 잠금에 대한 권위있는 정보원이라고 주장하고 싶지는 않지만 사용하려는 정의에 대한 참조를 원합니다. – Jason

1

내가 당신이 교착 상태가 간단한 예를 통해 무엇인지 이해하는 데 도움이하자

우리가 우리가 (T1, T2) 두 개의 스레드 우리가 L1L2의 인수를 필요로 두 가지 중요한 중요한 작업을 (OP1 and OP2)(L1, L2) 두 개의 잠금 장치 실행은

다음 실행 순서가 발생

T1 begins executing OP1 
T2 begins executing OP2 
T1 acquires L1 as part of OP1 
T2 acquires L2 as part of OP2 
T1 attempts to acquire L2 and is blocked because L2 is currently held by T1 
T2 attempts to acquire L1 and is blocked because L1 is currently held by T1 
,

따라서 우리는 치명적인 포옹을 당하고 있습니다. 이것은 단지 간단한 예일뿐입니다. 위 시나리오가있는 다이어그램을 작성하여 재생하면 도움이 될 것입니다. 잠금을 획득 한 순서는 교착 상태를 확인하는 데 중요합니다. 이것은 왜 이러한 문제가 간헐적으로 발생하고 디버깅하기가 어렵기로 유명한 이유 중 일부입니다.

관련 문제