2009-03-06 55 views
2

Hy,在多線程應用程序中查找/避免共享數據的規則

衆所周知,開發多線程應用程序是一件困難的事情。尤其是當什麼時候和什麼鎖定的時候,恕我直言並不那麼明顯。我經常看到一個方法/類,我必須問自己,如果我共享一些數據,這些數據可以被多個線程修改。而當我不確定它是否在一個完整的代碼塊中鎖定()時結束。

所以我想知道的是:您是否有模式/規則等方面的建議來識別共享數據?或者確保您的代碼是線程安全的技術。

例如爲:

  • 靜態方法不應該修改類的字段。 (除非他們鎖定該字段。)
  • 方法的引用類型參數不應直接傳遞。總是傳遞一個克隆。

順便說一句:

微軟研究院正在CHESS。在併發程序中查找和再現Heisenbugs的工具。我希望這和PLINQ將會改進併發程序的開發。

回答

3

只要有可能,使您的類型不可變,以開始。那麼就沒有必要克隆。如果您需要「更改」對象的內容,請使方法返回一個新對象 - 就像String.Replace等一樣。

這基本上是函數式編程風格,它很可愛。很遺憾,我們目前還沒有內置.NET框架的不可變集合,儘管第三方集合有including one by our own JaredPar

+0

聽起來很有趣。 http://codebetter.com/blogs/patricksmacchia/archive/2008/01/13/immutable-types-understand-them-and-use-them.aspx可能對想要了解更多信息的人有用。 – danio 2009-03-06 10:04:40

0

當使線程安全時,將數據封裝到類中非常有用。您可以控制數據的訪問方式,並且可以讓類負責同步,而不是讓整個應用程序的代碼嘗試正確同步。

此外,您還可以放置一個可用作鎖標識符的私有變量,以便您可以避免將數據本身用作鎖的標識符。通過將專用變量專用爲鎖定標識符,可以刪除一個可能的死鎖源。