2011-10-23 39 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語句和/或更改語句的鎖定級別。 它可以在語句本身中使用鎖定提示來完成。