哲學家用餐問題

2021-08-21 02:42:57 字數 1607 閱讀 7003

哲學家用餐問題,怎麼樣保證沒有死鎖,最直接的乙個方案就是要保證,每乙個哲學家在拿筷子的時候,左右兩邊都能拿到,才去拿,如果不能保證那就乙個筷子都不拿。

對與這個問題的實現,可以設定五個訊號量,標識筷子是否可以拿。具體**如下。

public static class person implements runnable 

@override

public void run()

} catch (interruptedexception e)

} }

public void thinking() catch (interruptedexception e)

} public void eating() catch (interruptedexception e)

} }

public static void main(string args)

executorservice executor=executors.newfixedthreadpool(5);

for (int i = 1; i < 6; i++)

}

上面用訊號量的方式在拿筷子之前會檢查兩個筷子是不是可用,不可用的話,當前執行緒並沒有掛起,而是直接跳過吃飯環節又去思考了,那麼我們想實現的是,沒有筷子我就要掛起,乙個人思考完就一定要吃,吃完就一定要思考,迴圈起來。那麼就需要對筷子的使用上鎖,對於筷子不能同時用,我們就直接掛起執行緒,在檢查筷子能不能同時用的時候,拿起乙隻筷子,在另乙隻不能用的情況下,就應該放下剛拿起的那乙隻,然後再阻塞執行緒。

static chop chops=new chop[6];  //筷子從1開始,人也是從1開始,逆時針排序

public static class chop

public void getchop() else

}else

condition.await();

}tag=true;

} catch (exception e) finally

} public void dropchop()

} public static class person implements runnable

@override

public void run()

} public void thinking() catch (interruptedexception e)

} public void eating() else

chops[index].getchop();

system.out.println("person"+ index+" eating");

thread.sleep(3000);

} catch (interruptedexception e)

} }public static void main(string args)

executorservice executor=executors.newfixedthreadpool(5);

for (int i = 1; i < 6; i++)

}

哲學家用餐問題

哲學家用餐問題,5位哲學家坐在圓桌旁,每對哲學家之間只有一根筷子。如果乙個哲學家可以拿起他旁邊的兩根筷子,他就可以吃東西。一根筷子可以由其相鄰的任何乙個哲學家拿起,但不能同時被兩個哲學家拿起。如果遵循乙個簡單的規則,就可以避免死鎖 讓所有執行緒以相同的順序宣告並釋放其鎖。這樣,您永遠不會陷入可能發生...

哲學家用餐問題

五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考。在這裡插入描述 分析 放在桌子上的筷子是臨界資源,在一段時間內...

linux多執行緒 3 哲學家用餐 mutex實現

ref 5跟筷子,5個哲學家,哲學家要吃飯,自然要兩根筷子,這樣就出現資源爭用的情況。哲學家只能用左邊和右邊的筷子,兩根筷子備齊才能吃飯!使用mutex的話,就是每個筷子乙個mutex,需要5個mutex,哲學家先lock左邊的筷子,如果有人已經在用那根筷子了,那就等著,不然左邊的筷子就拿到手了,然...