4

我必须模拟一个游戏,其中每个玩家都有轮流并且需要“注意”正在发生的事情。

到目前为止,我知道每个玩家都需要两个线程,一个会一直休眠到轮到玩家,另一个会注意。

我的问题是:我应该将每个玩家作为一个“叉子”和叉子上的线程工作,还是只是为玩家创建一些线程并以某种方式关联它们?

这是我第一次使用并发、信号量和线程,所以我不确定好的实践和编程风格。

4

2 回答 2

3

你偶然发现了一场巨大的宗教战争的边缘,围绕着这个问题

事件驱动程序应该使用多个线程还是使用单个事件循环来编写?

线程阵营认为,像“玩家”这样的个体实体在编写为实际线程时更容易编程,可能在不再需要处理器时明确放弃处理器。有关玩家状态的信息可以存储在局部变量中,甚至可以存储在程序计数器中。但是对于线程,您可能不得不担心原子性、死锁和并发编程的其他乐趣。

事件驱动阵营认为,如果每个实体都能够响应每个事件,并且该实体在处理事件所需的时间内完全控制处理器(这最好是有限的,通常最好是短的)。不必担心并发性,因为每个事件处理程序都是原子执行的,但是有一个编程成本:当事件处理程序完成时,它的所有过程都退出,因此有关其状态的信息必须存储在分配的对象的字段中堆。

当实体具有复杂的控制流或想要使用大量抽象时,线程的故事往往会大放异彩——如果没有线程,这两者都很难编码。当处理程序相当简单时,事件故事往往会大放异彩——让每个处理程序都以原子方式执行而不必担心,这很好,而且它简化了实体之间的通信。

在继续你的任务之前,找出你的导师属于哪个宗教团体

既然您询问了线程,我强烈推荐 Dave Hanson 的C 接口和实现中的线程和通道库。该软件是免费的,而且这本书值得购买——它包括许多其他模块,这些模块对于任何用 C 编写家庭作业的人来说都非常有用。

我应该将每个玩家作为一个“叉子”和叉子上的线程工作,还是只是为玩家创建一些线程并以某种方式关联它们?

除非您被要求使用fork,否则我会避免使用它——Unix 进程之间的通信机制使用起来并不那么愉快。如果您可以获得 Hanson 库,我会说为每个玩家创建一个线程,并让玩家使用 Hanson 的channels相互通信(以及与游戏服务器,这也应该是一个线程) 。

于 2010-03-29T01:59:46.867 回答
1

在基于回合的情况(游戏)中,您实际上不需要线程,纤维/协程会(更好)。

“注意”不需要线程,只需在您准备好再次采取行动时访问状态(-changes)。

于 2010-03-28T23:29:23.190 回答