2014-04-30 1 views
0

나는 철학자를위한 실을 만들고있었습니다. 다음은 의사 코드입니다.식당 철학자 용 실. 젓가락을 내려 놓는 순서

while(true) 
    think 
    get left chopstick 
    get right chopstick 
    eat 
    putdown left chopstick 
    putdown right chopstick 

직관적 인 것으로, 나는 젓가락을 덜어주는 순서가 중요하다고 생각하지 않습니다. 왼쪽 젓가락을 먼저 내려 놓은 상태에서 먼저 오른쪽 젓가락을 내려 놓을 수 있습니까? 이로 인해 오류가 발생합니까? 나는 그것을 의심한다. 교착 상태가 발생하면 어떻게됩니까? 그렇지 않다면, 먼저 떠났으면 좋겠다. 왜 그런가?

감사합니다. 잠금 (대기) 사이

while(true) 
    think 

    wait until you finished thinking 

    get left chopstick 
    get right chopstick 

    wait until you you took both sticks 

    eat 
    putdown left chopstick 
    putdown right chopstick 

일들은 중요하지 않기 때문에 어떤 순서로 할 수있는 성공 :

답변

0

는 현재 여러 가지 잠금 장치가 있습니다.

0

시각적으로 상상해보십시오. 4 명의 철학자가 있고 그 사이에 각각 젓가락이 있다고 가정 해보십시오.

4 명이 모두 왼쪽 젓가락을 한 번에 움켜 잡습니다. 모든 사람이 젓가락을 먹고 아무도 경쟁하지 않기 때문에 괜찮습니다.

오른쪽으로 보면, 젓가락은 남지 않았습니다. 왜냐하면 모든 사람들이 네 가지 중 하나를 가지고 있기 때문입니다.

그들은 먹을 수 없으므로 교착 상태에 빠집니다.

시간을두고 코드를 작성하고 젓가락을 내려 놓으면 모두가 왼쪽 젓가락을 집 으려하고 왼쪽에 올바른 젓가락이 없어지므로 같은 문제가 발생합니다. 발생하지는 않지만 코드를 작성하는 것이 좋습니다.

대신에 철학자를 골라서 오른쪽 젓가락을 먼저 집어 야합니다. 오른쪽 젓가락 철학자 나 철학자가 왼손으로 젓가락을 모두 먹고 먹을 수 있기 때문에 (교착 상태가되어 결국 모두에게 먹이를 줌) 교착 상태가 발생합니다.

0
while(true) 
    think 

    identify nearest chopstick set location 

    think 

    get nearest chopstick of set 
    get remaining chopstick of set 

    eat 

    putdown left chopstick 
    putdown right chopstick