【问题标题】:Multiple threads or process with threads多线程或多线程进程
【发布时间】:2010-03-28 23:24:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我猜你的任务是每个玩家使用一个线程。如果是这样,您应该在问题中明确说明。另外,每个玩家是一个人,线程是他/她的游戏界面,还是线程是玩家?另外,你必须在什么平台上运行它?我假设有一些 *nix。
  • @nateg,因为他不需要代码,所以平台几乎无关紧要。
  • @Henk:Windows 有 fork() 吗?我认为该平台与该抽象级别相关。

标签: c multithreading process concurrent-programming


【解决方案1】:

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

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

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

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

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

在继续您的作业之前,找出您的教师属于哪个宗教团体

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

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

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

【讨论】:

  • 不需要使用fork,因为一般建议是避免Unix进程之间的通信,所以我会选择线程。我会尽量尽快完成作业,并有时间看看过程方式(只是为了知道他们有多不愉快)。感谢您的回答和书籍建议。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多