多个线程或进程中的线程

4

我需要模拟一个游戏,每个玩家轮流进行操作并需要“关注”游戏进程。

目前,我已经知道需要为每个玩家使用两个线程,一个将休眠直到该玩家的回合,另一个负责关注游戏进程。

我的问题是:我应该将每个玩家作为“fork”,并在fork上使用线程?还是只创建一些线程并将它们与玩家相关联?

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


我的猜测是你的任务是为每个玩家使用一个线程。如果是这样,你应该在问题中明确说明。此外,每个玩家是一个人,线程是他/她与游戏交互的接口,还是线程就是玩家本身?另外,在哪个平台上运行这个程序?我假设是某个*nix系统。 - nategoose
@nateg,既然他不需要代码,那么平台几乎无关紧要。 - H H
@Henk:Windows有fork()函数吗?我认为在那个抽象层面上平台是相关的。 - Duncan
2个回答

3
你不小心卷入了一场围绕着一个问题展开的宗教战争:
“事件驱动程序应该使用多线程编写还是使用单个事件循环?”
线程阵营认为,像“玩家”这样的个体在编写实际线程时更容易编程,可能会在不再需要处理器时明确地放弃它。玩家状态的信息可以存储在本地变量甚至程序计数器中。但是,使用线程可能需要担心原子性、死锁和并发编程的其他乐趣。
事件驱动阵营认为,当每个实体都能够响应每个事件,并且该实体在处理事件所需的时间内获得了处理器的完全控制(最好是有限的,并且通常最好是短暂的),则更容易正确地完成整个应用程序。由于每个事件处理程序都以原子方式执行,因此无需担心并发问题,但代价是编程成本:当事件处理程序完成时,所有过程都会退出,因此必须将其状态的信息存储在堆上分配的对象的字段中。
线程的使用场景通常在实体具有复杂控制流或需要使用大量抽象时会更加突出,这两者都很难在没有线程的情况下编写代码。事件的使用场景通常在处理程序相对简单时更加突出——每个处理程序都能够原子执行而无需担心,这简化了实体之间的通信。
在继续你的任务之前,请找出你的教练属于哪个宗教团体
既然你问到了线程,我强烈推荐 Dave Hanson 的C Interfaces and Implementations中的线程和通道库。该软件是免费的,购买这本书是值得的——它包含许多其他模块,对于任何使用C语言编写作业的人都非常有用。

我应该将每个玩家作为“fork”并在“fork”上运行线程,还是只创建一些线程并将其与玩家相关联?

除非你被要求使用fork,否则我建议避免使用它——在Unix进程之间进行通信的机制并不是很易于使用。如果你能获取Hanson库,我建议为每个玩家创建一个线程,并使用Hanson的channels让玩家之间(以及与游戏服务器,它也应该是一个线程)进行通信。


不需要使用fork,而且由于一般建议避免Unix进程之间的通信,我会选择线程。我会尽快完成任务并有时间去了解进程方式(只是为了知道它们可能有多么令人不愉快)。感谢您的答复和书籍建议。 - sergiobuj

1
在回合制情况下(游戏),实际上不需要线程,纤程/协程会更好。
“关注”并不需要线程,只需要在准备再次行动时访问状态(-更改)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接