【问题标题】:Can multithreading affect Conway's Game of Life clone?多线程会影响康威的生命游戏克隆吗?
【发布时间】:2011-03-19 02:39:34
【问题描述】:

我一直在实现这个小游戏的想法,它(不知何故?)类似于康威的生命游戏:

0) 你有一个彩色点矩阵(RGB 值) 1)如果相邻单元格的 X 值低于您的 Y,则将 Y = 0 放在该单元格上 (其中 X 和 Y 为红色 || 绿色 || 蓝色) 2)红色击败绿色击败蓝色击败红色

我现在正在做的只是逐个单元格地检查是否满足上述规则。然而,这种行为并不是我想要的,因为有时第一行的单元格比最后一行的单元格更有优势。

多线程可以防止这种情况吗(例如,启动两个线程,一个在第一个单元格中启动,另一个在最后一个单元格中启动)?请原谅我对并发的无知,但我觉得这是开始使用它的好方法。

【问题讨论】:

    标签: multithreading cellular-automata


    【解决方案1】:

    我的猜测是您正在就地更新矩阵,而您应该复制跟踪矩阵的旧状态,更新一个新状态,然后用更新的替换原始状态。 这样,您就不会更新某些单元格,然后在下一行测试它们的值。 因此,这将是一个算法问题,与编程无关(因此多线程无济于事)。

    【讨论】:

    • 但是一旦您更改为使用第二个矩阵,这将是可以通过多线程显着加速的东西。如果您创建了两个线程,一个执行上半部分,另一个执行下半部分(这样它们就不会写入相同的内存空间),您根本不需要任何同步——它们都会全速飞行。
    • 感谢您的建议。事实上,我是在按事实更新矩阵,而不是存储更改并在最后应用它们。我将使用 DeadMG 的想法对其进行更改。 @Bill K:您的意思是使用多线程将新矩阵的更改应用到原始矩阵?
    • @Bill K:当然,但问题是关于多线程和行的第一个不平衡。 @Gastón:你可以想象几种方法来多线程你的程序。但在这种情况下,您将有一个线程来打印游戏的当前状态,然后如果您的矩阵很大,您可以有多个线程来更新矩阵的不相交部分。例如,使用 2 个线程,您可以更新新矩阵的一半,同时读取相同的原始矩阵,然后在两个线程完成工作时复制到原始矩阵。
    • 快速优化:保留“当前”和“工作”矩阵的指针,当您计算出下一代时,交换指针。不涉及复制!
    【解决方案2】:

    没有。你的问题是一个固有的缺陷。您遇到的问题是您使用的是中间结果,即在此更新中,一个单元格中的更改会立即影响下一个单元格。它不应该。您应该创建一个新矩阵,将更改的值存储在其中,然后交换它们以便加载新值。重复。

    【讨论】:

    • 是的,你是对的。起初我想有一个队列来存储修改,一旦处理了所有单元格,就开始出列并应用更改。我最终放弃了它(糟糕的举动:)),但想法是相似的(虽然你的似乎更简单)。
    【解决方案3】:

    你最好调整你的算法来防止这种情况发生。

    依靠多线程来改变行为并不是一件好事。这实质上是试图在您的代码中引入竞争条件。通常,在向算法添加多线程时,首要任务是防止任何行为变化。

    通过尝试使用竞争条件来改变行为,您正在使这种情况变得非常不确定,但不是一种好的方式。您最好尝试提出不同的解决方案(可能使用伪随机数生成器等),然后引入多线程以使其更快(希望不会影响结果)。

    【讨论】:

      【解决方案4】:

      这取决于您选择多线程处理的哪一部分。 prototypical 多线程示例是矩阵乘法器。您基本上可以将其分解为象限并在每个线程中计算一个象限,除了原始矩阵之外不共享信息。请注意,生命游戏是一个稀疏矩阵,may or may not 受益于多线程。

      但是,如果您决定这样做,请记住,所有内容都应计算“下一回合”所需的内容并将其放入新矩阵中,当换入矩阵时(最好不要复制,只需在回合结束时在某处更改指针),以便一个线程不会更改其他线程进行计算所需的值。所以线程不能被允许“提前转弯”。这可能意味着使用多个线程效率低下 - 您的里程可能会有所不同。

      【讨论】:

        猜你喜欢
        • 2013-02-21
        • 1970-01-01
        • 2010-09-07
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多