黑白棋子问题

文章介绍了在两人下黑白棋游戏中,如何通过信号量机制保证轮流下子的规则。在第一种情况下,黑棋先下,使用两个信号量bfg和wfg实现。在第二种情况,双方抢棋盘先下,引入互斥信号量m和标志变量fg,确保公平竞争和交替下棋。
摘要由CSDN通过智能技术生成

黑白棋子问题

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);
      }
}

来源1
来源2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亖嘁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值