問題描述
兩個人下棋,一方執(zhí)黑棋,一方執(zhí)白棋。要求雙方輪流下子。給出兩種情況的解決辦法:
1)執(zhí)黑子一方先下
2)雙方都可以先下,誰先搶到棋盤誰先下。然后開始輪流下子。
1)執(zhí)黑子一方先下信號量:b=1,w=0
黑:
while(沒結(jié)束){
wait(b);
下一黑棋;
signal(w);
}
白:
while(沒結(jié)束){
wait(w);
下一白棋;
signal(b);
}
2)先搶到棋盤者先下,然后輪流下子
問題分析:
無法用單純的信號量操作完成,因為初始值無法設置固定值。
爭搶棋盤需要一個互斥信號m;加入if控制與標志判斷。利用互斥信號量與特殊標志變量的結(jié)合使用實現(xiàn)有序控制。
Semaphore? ? m=1;turn=0;
黑
while(沒結(jié)束){p(m);if (turn<>2)
下一黑子;
? turn=2;
v(m)
}
白:
while(沒結(jié)束){
p(m);
if (turn<>1)
下一白子;
turn=1;
v(m)
}?