【问题标题】:Using Semaphores to ensure order使用信号量确保顺序
【发布时间】:2015-10-08 04:57:23
【问题描述】:

假设有一个游戏,三个玩家移动,每个玩家都被赋予一个颜色 (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 会在 Green 得到 R 信号量之前得到它。

还有其他方法可以做到这一点吗?我错过了什么吗?

【问题讨论】:

    标签: semaphore pseudocode


    【解决方案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)
    }
    

    红色玩家不必等到他移动之后。移动后,他发出移动的信号,等待蓝的信号。

    绿色玩家最初等待红色的信号。当他得到它时,他会移动然后发出信号。当我们下一次进入 Green 'function' 时,他会再次等待 Red 的信号。

    蓝色玩家和绿色玩家做同样的事情,除了他在等待绿色的信号而不是红色的信号。

    你可以看到,这可以推广到任何正整数的颜色。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 2018-01-03
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多