在多线程应用程序中查找/避免共享数据的规则

时间:2009-03-06 09:36:56

标签: c# multithreading c#-3.0

HY,

众所周知,开发多线程应用程序是一件困难的事情。特别是当何时和什么锁定点不是那么明显恕我直言。我经常看一个方法/类,我必须问自己,如果我共享一些数据,可以通过多个线程修改。当我不确定它是否在整个代码块中的lock()结束时。

所以我想知道:您是否有关于模式/规则等的建议来识别共享数据?或者确保代码是线程安全的技术。

E.g:

  • 静态方法不应修改类字段。 (除非他们锁定了场地。)
  • 方法的参考类型参数不应“直接”传递。始终传递克隆。

顺便说一下:

Microsoft Research正致力于CHESS。在并发程序中查找和复制Heisenbugs的工具。我希望这和PLINQ能够改进并发程序的开发。

2 个答案:

答案 0 :(得分:3)

尽可能使您的类型不可变。然后就没有必要克隆了。如果您需要“更改”对象的内容,请使该方法返回一个新对象 - 就像String.Replace等一样。

这基本上是函数编程风格,它很可爱。遗憾的是,我们(目前)没有内置于.NET框架中的不可变集合,而第三方集合也是including one by our own JaredPar

答案 1 :(得分:0)

在使线程安全时,将数据封装在类中非常有用。您可以控制数据的访问方式,并且可以让类负责同步,而不是让整个应用程序的代码都尝试正确同步。

此外,您可以在某处放置一个可用作锁定标识符的私有变量,以便您可以避免将数据本身用作锁定的标识符。通过将专用变量专用作锁定标识符,可以删除一个可能的死锁源。