轉自http://blog.csdn.net/l294265421/article/details/46674847java
假設有兩個進程須要互斥的訪問某一個臨界區。算法
Peterson算法的形式以下:spa
enterRegion(process);
// process表示進程號 // 臨界區 leaveRegion(process);
具體實現以下(Java實現):
.net
有兩個全局變量:rest
// 用於表示輪到哪一個進程 private int turn; // 用於表示進程進入臨界區的意願,下標對應進程號 private boolean[] interested = new boolean[] {false, false};
enterRegion方法實現以下:code
/** * @param process 進程號 */ ublic void enterRegion(int process) { // 另外一個進程的進程號 int other = 1 - process; // 進程process想進入臨界區 interested[process] = true; // 設置輪到本身進入臨界區了 turn = process; /** * 當兩個進程同時想進入臨界區時,它們的interested[process]都 * 爲true,但後一個進程設置的turn值會覆蓋前一個進程設置的turn值, * 這樣後一個進程的turn == process條件爲真,它會在該while循環 * 中持續等待,而前一個進程的turn == process條件爲假,能順利進入 * 臨界區;等前一個進程離開臨界區後,後一個進程也能進入臨界區 */ while (turn == process && interested[other] == true) { }
leaveRegion方法實現以下:blog
public void leaveRegion(int process) { interested[process] = false; }