避免多线程问题的指南

时间:2011-05-03 10:12:56

标签: c# multithreading

我正在开发一个游戏,其中每个对象都有自己的线程,并在其中移动并执行其操作 我有一个中心对象,协调所有对象之间的所有交互。我遇到了随机对象的多个问题,只是在随机时间做随机事情而我无法重现这些问题,它们发生在大约100次运行中。我甚至遇到了一个不可能发生的事情 - 在程序中间写入一个字段,其中唯一的写入语句是在程序的开头。
我可以遵循什么准则来解决这个问题,而不是通过在每次传递时锁定中心对象来讨好所有线程。我不想让它们扁平化,因为它会导致“手风琴”运动。引用手风琴移动是指对象1,2,3,4,5需要向右移动并发生(时间向下)。

54321
5432 1
543 21
54 321
5 4321
 54321

编辑:只是澄清:
我使用一个框架,我认为为每个对象创建一个线程,我无法控制它。所有对象都被称为连续更新函数,我发现在我遇到多线程代码中发生的一些错误后,它们会并行执行其中的一些操作。它可能会汇集线程或为每个线程分配一些对象进行更新,但我不能确定,除非你能告诉我如何用科学方法解决这个问题。

2 个答案:

答案 0 :(得分:4)

首先。使用几百个线程会使您的程序 更慢 。使用千线程非常可怕。您应该重新考虑您的应用程序设计。 ThreadPool可能更合适吗?

这是一篇很好的文章,解释了所有线程概念:http://msdn.microsoft.com/en-us/magazine/cc163744.aspx

  

正如我在评论中所说,我使用一个自动生成线程的框架,我无法控制

好。然后你必须错误地使用框架。任何游戏框架开发人员都没有办法制作一些东西,以便每个设计创建数百个线程。

答案 1 :(得分:2)

主要是:不要不必要地使用多线程,因为并行性很难,因为你开始发现(例如race conditions)。如果您认为线程解决了问题,请使用线程工作池来扩展处理器/核心数,而不是问题大小(对象数)。

在您的特定情况下:将物理和对象交互与渲染隔离开来。我怀疑你可以在一次扫描中(并在一个线程中)完成所有对象更改,然后渲染它们,避免任何手风琴(!)。