0

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

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

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

4

2 回答 2

1

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

于 2011-10-23T16:09:48.623 回答
0

一个典型的 Windows 安装很容易有 900 个线程。查看 Taskmgr.exe,性能选项卡。他们中的绝大多数将被阻止等待某些事情发生。添加另外 50 个不会对此产生太大影响。他们不会执行太多代码,他们会一直等待 dbase 服务器完成它的工作。因此,启动那么多线程并不是很有用,代码的性能完全受到 dbase 引擎执行查询的速度的限制。您可以再次从 Taskmgr.exe 轻松判断,如果 cpu 负载不是 100%,那么添加更多线程将无济于事。

不,死锁是由代码引起的,而不是资源不足。保持 50 个球在空中而不掉落一个是一个非常困难的编程问题。使用 Debug + Windows + Threads 调试窗口来了解为什么线程没有取得进展。

于 2011-10-23T15:54:47.333 回答