簡體   English   中英

將.NET類庫轉換為多線程.NET類庫的最佳實踐

[英]Best practices to turn a .NET class library into a multithreaded .NET class library

我有一些C#類庫,它們的設計沒有考慮並發,多線程,鎖等等......

代碼結構非常好,易於擴展,但它可以從多線程中受益匪淺:它是一組科學/工程庫,需要在非常短的時間內執行數十億次計算(現在它們不會帶來好處從可用的核心)。

我想將所有這些代碼轉換為一組多線程庫,但我不知道從哪里開始,我沒有任何以前的經驗。

我可以使用任何可用的幫助,以及任何建議/建議。

我的建議是不要這樣做。 您沒有編寫要並行使用的代碼,因此它不會起作用,並且它將以難以調試的方式失敗。

相反,我建議您提前決定該代碼的哪一部分可以從並行性中受益最多,然后從頭開始重寫該代碼並行。 您可以利用在您面前擁有未修改的代碼,也可以利用現有的自動化測試。

使用.NET 4.0 任務並行庫可能會使工作更輕松,但它不會完全彌合未設計為並行的代碼與代碼之間的差距。

我強烈建議您查看.NET 4和任務並行庫 (也可以通過Rx Framework在.NET 3.5sp1中使用)。

它使許多並發問題變得非常簡單,特別是數據並行性變得非常簡單。 由於您在大多數科學/工程圖書館處理大型數據集,因此數據並行性通常是可行的方法......

對於一些參考資料,特別是關於數據並行性和有關分解和解決問題的背景,您可能想閱讀我在.NET 4中的Parallelism博客系列。

如果您之前沒有任何多線程經驗,那么我建議您先查看各種資源,先了解基礎知識: https//stackoverflow.com/questions/540242/book-or-resource-on-c-並發

使整個庫成為多線程需要一種全新的架構方法。 如果您只是四處走動並開始在代碼中的任何地方放置鎖定,那么最終會使代碼變得非常麻煩,甚至可能無法實現性能提升。

最好的並發軟件是無鎖且無需等待的......這在C#(.NET)中很難實現,因為大多數集合都不是無鎖,無等待甚至是線程安全的。 關於無鎖數據結構的討論各不相同。 很多人都引用了Boyet的文章 (這些文章非常好),有些人一直在使用任務並行庫作為.NET並發中的下一個東西,但是TPL在線程安全集合方面確實沒有給你太多幫助。

.NET 4.0推出了Collections.Concurrent ,它應該會有很多幫助。

不建議將整個庫並發使用,因為它從一開始就沒有考慮並發性。 您的下一個選擇是通過您的庫並確定它的哪些部分實際上是多線程的合適候選者,然后您可以為它們選擇最佳的並發解決方案並實現它。 要記住的主要事情是,當您編寫多線程代碼時,並發性應該會提高程序的吞吐量。 如果未實現增加的吞吐量(即,您匹配或吞吐量小於順序版本中的吞吐量),那么您應該不在該代碼中使用並發。

最好的起點可能是http://msdn.microsoft.com/en-us/concurrency/default.aspx

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM