黑白棋子问题
1、问题描述
两个人下棋,一方执黑棋,一方执白棋。要求双方轮流下子。
给出两种情况的解决办法:
(1)执黑子一方先下。(2)双方都可以先下,谁先抢到棋盘谁先下。
2、解决
情况(1)
信号量:bfg=1,wfg=0
//注意信号量及初值的设置,保证黑方先下子且之后双方轮流下子。
seamphore bfg=1,wfg=0;
void main()
{
black();
white();
}
void black()
{
while(true)
{
wait(bfg);//
if whereput()
{put a black qizi;}//下一黑棋
else break;
signal(wfg);//
}
}
void white()
{
while(true)
{
wait(wfg);//
if whereput()
{put a white qizi;}//下一白棋
else break;
signal(bfg);//
}
}
情况(2)
争抢棋盘需要一个互斥信号m;加入if控制与标志判断。利用互斥信号量与特殊标志变量的结合使用实现有序控制。
下面给出两种实现方案。
方案一
方案二
seamphore bfg=1,wfg=0,m=1;
boolean fg=F;
void main()
{
black();
write();
}
void black()
{
wait(m);
if(!fg)
{
bfg=1;wfg=0;fg=T;
}
signal(m);
while(true){
wait(bfg);
if whereput()
{
put a black qizi;
signal(wfg);
}else
{
signal(wfg);
break;
}
}
void white()
{
wait(m);
if(!fg)
{
bfg=0;wfg=1;
fg=T;
}
signal(m);
while(true){
wait(wfg);
put a white qizi;
signal(bfg);
}
}