我正在尝试为基于Linux的系统创建一个游戏,其中有三个进程:
裁判员-主要流程
蓝色玩家-第一个子进程
红色玩家-第二个子进程
当然,这两个子进程是使用fork()
函数创建的。
现在一切都创建好了,我使用共享内存来存储电路板和其他一些变量,这是三个进程的共同点。
我的问题是,当我试图思考如何实现基于回合的游戏时,我创建了一个公共布尔变量,该变量指示游戏是否仍在运行或完成,并决定轮到谁。
现在我们进入共享部分,我暂停了两个子进程,并向第一个子进程发送信号“唤醒他”,但从现在开始,我如何保持所有三个子进程在一起并同步(裁判员唤醒第一个进程,它完成转弯并暂停,而裁判员唤醒第二个进程,等等…)
我想我得把那部分保持在某种循环中,但从那开始我就卡住了。
我该如何用我刚才解释的方式实现这个游戏?谢谢。
最佳答案
有几种选择,但忙碌的等待是最糟糕的。您可以考虑一个基于共享信号量的解决方案,但我会选择一个基于管道的解决方案。进程将阻止对当前没有数据的打开文件描述符执行读取,因此这是使各个进程彼此等待以便轮流执行的简单方法。
只需在裁判过程和每个球员过程之间的每个方向创建管道。在每个回合中,每个球员进程都试图从裁判那里读取一个字节。除非裁判在烟斗的末端写上什么,否则比赛不会继续进行。另外,写入的字节可以传送额外的数据/指令,例如,用来区分“玩”和“游戏结束”。当然,同样的同步也在另一个方向上起作用。