2

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

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

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

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

4

4 回答 4

7

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

于 2010-07-21T16:32:29.907 回答
3

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

于 2010-07-21T16:35:28.523 回答
1

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

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

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

于 2010-07-21T16:32:28.407 回答
0

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

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

于 2010-07-21T16:58:23.850 回答