我一直在实施这个小游戏的想法,它(不知何故?)类似于康威的生命游戏:
0)你有一个彩色矩阵(RGB值) 1)如果相邻单元格的X值低于Y,则在该单元格上放置Y = 0 (其中X和Y为红色||绿色||蓝色) 2)红色节拍蓝色节拍红色
我正在做什么现在它只是逐个细胞,检查是否满足上述规则。然而,这种行为并不是我想要的,因为有时第一行的单元格比结束行的单元格有优势。
多线程可以阻止这种情况(例如,启动两个线程,一个在第一个单元格中启动,另一个在最后一个单元格中启动)?请原谅我对并发性的无知,但我觉得这是开始使用它的好方法。
答案 0 :(得分:7)
我的猜测是你正在更新矩阵,而你应该复制保持跟踪矩阵的旧状态,更新一个新的,然后用更新的原始替换。 这样,您不会更新某些单元格,然后在下一行测试它们的值。 因此,这将是一个算法问题,与编程无关(因此多线程无法帮助)。
答案 1 :(得分:3)
没有。你的问题是一个固有的缺陷。您遇到的问题是您正在使用中间结果,即在此更新中,一个单元格中的更改会立即影响下一个单元格。它不应该。您应该创建一个新矩阵,将更改后的值存储在那里,然后交换它们以便加载新值。重复。
答案 2 :(得分:1)
你最好调整算法以防止这种情况发生。
依靠多线程来改变行为并不是一件好事。实际上,这是尝试在您的代码中引入竞争条件。通常,在向算法添加多线程时,首要任务是阻止行为的任何更改。
通过尝试使用竞争条件来改变行为,你会使这非常不确定,但不是很好。尝试为此提出不同的解决方案(可能使用伪随机数生成器等),然后引入多线程以使其更快(希望不影响结果),你会好得多。
答案 3 :(得分:0)
这取决于您选择多线程处理的哪个部分。 prototypical多线程示例是矩阵乘数。您基本上可以将其分解为象限并计算每个线程中的一个象限,除了原始矩阵之外不共享信息。请注意,生命游戏是一个稀疏矩阵,may or may not受益于多线程。
但是,如果您决定这样做,请记住,所有内容都应计算“下一回合”所需的内容并将其置于新矩阵中,当交换矩阵时(最好不要复制,只需在转弯结束时更改某个位置的指针,以便一个线程不会更改其他线程需要进行计算的值。因此,线程不能被允许彼此“先行一步”。这可能意味着使用多个线程效率低下 - 您的里程可能会有所不同。