2011-10-23 37 views
0

我写了一个简单的应用程序,它构建了999个项目的并行字典,然后使用ThreadPool.SetMinThreads()方法激发50个线程。然后,我遍历999个字典条目并更新数据库中的一条记录,以标记条目已被处理。打电脑限制?

运行应用程序时,我可以看到线程已经启动,然后我可以运行SQL查询来查看正在更新的记录。到目前为止,所有这些工作都很顺利。当一些初始线程完成时,下一批线程开始(这正是我想要的)。我仍然可以看到数据库中的记录仍在更新,告诉我应用程序按预期工作。我仍然可以看到正在创建的新线程,然后发生死锁。当我看到僵局时,它是从最初的50个线程中的一个开始的。这是我的问题进来的地方。

我正在使用6Gb RAM的3Ghz双核处理器上运行应用程序。我的SQL Server实例也在同一台机器上运行,但我不会认为这会是一个问题。该应用程序是一个概念证明,但无法在开发环境中运行50个线程看起来并不乐观。我知道在生产环境中,SQL实例将在单独的计算机上运行,​​应用程序也一样。有任何想法吗?

+1

什么样的死锁 - 在SQL或在您的代码? –

+3

死锁与内存消耗无关,并且与共享状态有关。 –

+0

对不起,它们是SQL死锁 –

回答

0

典型的Windows安装很容易有900个线程正在进行。检查Taskmgr.exe,性能选项卡。绝大多数人将被阻止等待发生。增加另一个50不会对此产生太大的影响。他们不会执行很多代码,他们会不断地等待dbase服务器完成其工作。因此,启动多个线程并不是非常有用,您的代码的性能完全受限于dbase引擎可以执行查询的速度。你可以很容易地从Taskmgr.exe中得知,如果CPU负载不是100%,那么添加更多的线程将无济于事。

不,死锁是由代码造成的,而不是资源的缺乏。并且保持50个球在空中而不丢失一个球是一个非常困难的编程问题。使用“调试+ Windows +线程”调试窗口了解为什么一个线程没有取得进展。

1

如果您从多个线程更新同一个表,则可能会发生数据库死锁。您似乎需要重新运行失败的SQL语句和/或更改语句的锁定级别。 它可以在语句本身中使用锁定提示来完成。