2010-03-28 143 views
5

我必须模拟一个游戏,每个玩家都转过身,需要“注意”发生了什么。多线程或线程进程

到目前为止,我知道我需要两个线程每个球员,一个将休眠,直到玩家的回合和其他关注。

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

这是第一次,所以我不知道的良好做法和编程风格我已经并发,信号量和线程的工作。

+0

我的猜测是你的任务是你使用每个玩家的线程。如果是这样,你应该在你的问题中说清楚。另外,每个玩家是一个人还是他/她的游戏界面的线程,还是玩家的线程?另外,你需要在什么平台上运行?我假设一些* nix。 – nategoose 2010-03-28 23:37:19

+0

@nateg,因为他不需要代码,所以平台几乎不相关。 – 2010-03-28 23:40:29

+0

@亨克:Windows有fork()吗?我认为该平台在抽象层面是相关的。 – Duncan 2010-03-29 00:34:45

回答

3

你无意中发现了一个巨大的宗教战争的边缘,围绕问题旋转

是否应事件驱动程序使用多个线程或者使用一个事件循环写?

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

事件驱动的阵营认为,当每个实体都能够响应每个事件时,获得整个应用程序就会更简单,并且该实体获得处理器所需的时间量事件(最好是有限的,通常最好是短的)。不需要担心并发性,因为每个事件处理程序都以原子方式执行,但是存在编程成本:当事件处理程序结束时,其所有过程都会退出,因此有关其状态的信息必须存储在分配给堆。

当一个实体具有复杂的控制流或想要使用很多抽象时,线程故事往往会发光—这两个都很难在没有线程的情况下编码。当处理程序非常简单时,事件故事就会发光—让每个处理程序都以原子方式执行而不必担心它,这很好,并且它简化了实体之间的通信。

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

既然你问起线程,我强烈建议在大卫汉森的C Interfaces and Implementations线程和渠道库。该软件是免费的,这本书是值得购买—它包括很多其他模块,这将是任何人写家庭作业非常有用的C.

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

除非你被要求使用fork,我会避免它—用于Unix进程间通信的机制是不是愉快的使用。如果你能得到汉森图书馆,我会说每个玩家创建一个线程,并且使用汉森的频道让玩家彼此(以及游戏服务器,这也应该是一个线程)进行通信。

+0

使用fork不是必需的,因为一般的建议是避免Unix进程之间的通信,所以我会选择线程。我会尽快完成任务,并有时间看看流程方式(只是为了知道它们会有多不愉快)。感谢您的答案和书中的建议。 – sergiobuj 2010-03-29 02:38:19

1

在回合制的情况下(游戏),你其实不需要线,纤维/协同程序会做(好)。

“注重”不需要一个线程,给国家(-changes)刚刚访问,当您准备再次采取行动。