1.黑白棋子问题
问题描述:两个人下棋,一方执黑棋,一方执白棋。要求双方轮流下子。给出两种情况的解决办法:
(1)执黑子一方先下
(2)双方都可以先下,谁先抢到棋盘谁先下。然后开始轮流下子。
执黑子一方先下
信号量:b=1,w=0
黑:
while(没结束){
wait(b);
下一黑棋;
signal(w);
}
白:
while(没结束){
wait(w);
下一白棋;
signal(b);
}
解题思想:
设了两个信号量,因为b=1,黑旗执行wait(b)操作时b=0,可以继续执行signal(w)操作。
但是在白旗中w=0,执行wait(w)操作时(w=-1)会被锁住,这是需要等黑旗执行signal(w)操作时(w=0)才可继续执行signal(b)操作,这样保证了黑旗先下然后再白旗下的顺序。
先抢到棋盘者先下,然后轮流下子
问题分析:
无法用单纯的信号量操作完成,因为初始值无法设置固定值。
争抢棋盘需要一个互斥信号m;加入if控制与标志判断。利用互斥信号量与特殊标志变量的结合使用实现有序控制。
Semaphore m=1; //表示信号量m
turn=0; //普通变量turn
黑
while(没结束){
p(m);
if (turn!=2) 下一黑子;
turn=2;
v(m)
}
白:
while(没结束){
p(m);
if (turn!=1) 下一白子;
turn=1;
v(m)
}
解题思想:
通过使用信号量m实现了谁先抢到m,谁就先下棋。并且通过使用普通变量turn实现了下棋的顺序,不会出现连续下白旗或者黑旗的情况。