多个线程或带线程的进程

时间:2010-03-28 23:24:51

标签: c multithreading process concurrent-programming

我必须模拟一个游戏,每个玩家都有转弯,需要“关注”正在发生的事情。

到目前为止,我知道每个玩家需要两个线程,一个会在玩家轮到你之前睡觉,另一个会注意。

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

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

2 个答案:

答案 0 :(得分:3)

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

  

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

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

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

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

在继续执行作业之前,了解您的教师属于哪个宗教团体

由于您已经询问了线程,我强烈推荐Dave Hanson C Interfaces and Implementations中的线程和通道库。该软件是免费的,本书值得购买 - 它包含许多其他模块,对于任何用C编写家庭作业的人来说都非常有用。

  

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

除非你被要求使用fork,否则我会避免使用它 - 在Unix进程之间进行通信的机制并不是那么令人愉快。如果你能得到汉森图书馆,我会说每个玩家创建一个帖子,并让玩家使用汉森的频道与对方(以及游戏服务器,也应该是一个线程)进行通信

答案 1 :(得分:1)

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

'注意'不需要线程,只需在准备好再次操作时访问状态(-changes)。