使用信号量确保订单

时间:2015-10-08 04:57:24

标签: semaphore pseudocode

假设存在三个玩家移动的游戏,并且每个玩家都被赋予颜色(R,G,B)。有没有办法确保玩家按顺序移动R然后G只使用信号量B,如果必须制作三个例程(每个玩家移动一个)? (假设R将始终开始)。

这个问题不应该考虑到特定编程语言中可能存在的任何特殊类型的信号量,而应该只是一个教科书信号量。

我建议的解决方案是(伪代码):

Red {
     wait(R)
     wait(B)
     wait(G)
          Move Red
     signal(G)
     signal(B)
     signal(R)
}

Blue {
     wait(R)
     wait(B)
     wait(G)
          Move Blue
     signal(G)
     signal(B)
     signal(R)
}

Green {
     wait(R)
     wait(B)
     wait(G)
          Move Green
     signal(G)
     signal(B)
     signal(R)
}

但我不认为这是有效的,因为虽然Red保证先行,但我们不知道Blue会在Green得到之前获得B信号量;甚至在Blue获得它之前Blue会得到R信号量。

还有其他办法吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

如果你看一下你的代码,那就是所有三个任务' (红色,绿色和蓝色)都具有相同的结构,这是一个可能出错的危险信号。

首先考虑2色案例 - 它可能会帮助您思考问题。

如果我们只想让蓝色前的红色,我们可以写

Red 
{
   Move Red
   signal(R)
   wait(B)
}

Blue
{
   wait(R)
   Move Blue
   signal(B)
}

如果我们想要3色的情况,我们可以扩展

Red 
{
   Move Red
   signal(R)
   wait(B)

}

Green
{
   wait(R)
   Move Green
   signal(G)
}

Blue
{
   wait(G)
   Move Blue
   signal(B)
}

红色球员不必等到他被移动之后。在他移动之后,他发出信号表示他已经移动并等待Blue的信号。

Green玩家最初等待Red的信号。当他得到它时,他移动然后发出信号。当我们接下来进入Green'功能时,他会再次等待Red的信号。

Blue玩家与绿色玩家做同样的事情,除了他等待Green的信号而不是Red的信号。

您可以看到,这可以针对任何正整数个颜色进行推广。

答案 1 :(得分:0)

我认为你可以通过循环信号来实现这一目标。 要开始游戏,您需要直接向玩家1发出信号。 然后序列如下: - 等待红色。移动红色。信号蓝色。 - 等待蓝色。移动蓝色。信号绿色。 - 等待绿色。移动绿色。信号为红色。