Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多线程应用程序中查找/避免共享数据的规则_C#_Multithreading_C# 3.0 - Fatal编程技术网

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

C# 在多线程应用程序中查找/避免共享数据的规则,c#,multithreading,c#-3.0,C#,Multithreading,C# 3.0,Hy 众所周知,开发多线程应用程序是一件困难的事情。特别是什么时候锁什么锁的问题在IMHO中并不那么明显。我经常看到一个方法/类,我必须问自己,我是否共享一些数据,这些数据可以由多个线程修改。当我不确定它是否在整个代码块上以锁()结尾时 所以我想知道的是:您是否对识别共享数据的模式/规则等有建议?或确保代码是线程安全的技术 例如: 静态方法不应该修改类字段。(除非他们锁定该字段。) 方法的引用类型参数不应“直接”传递。总是传递一个克隆 顺便说一下: 微软研究院正在进行这项研究。在并发程序中查

Hy

众所周知,开发多线程应用程序是一件困难的事情。特别是什么时候锁什么锁的问题在IMHO中并不那么明显。我经常看到一个方法/类,我必须问自己,我是否共享一些数据,这些数据可以由多个线程修改。当我不确定它是否在整个代码块上以锁()结尾时

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

例如:

  • 静态方法不应该修改类字段。(除非他们锁定该字段。)
  • 方法的引用类型参数不应“直接”传递。总是传递一个克隆
顺便说一下:


微软研究院正在进行这项研究。在并发程序中查找和复制海森堡的工具。我希望这和PLINQ将有助于改进并发程序的开发。

只要有可能,就让您的类型从一开始就保持不变。那就不需要克隆了。如果需要“更改”对象的内容,请让该方法返回一个新对象,就像
String.Replace
etc一样


这基本上就是函数式编程风格,非常可爱。不幸的是,我们(目前)没有在.NET framework中内置不可变的集合,尽管周围有第三方的集合。

将数据封装在类中有助于实现线程安全。您可以控制数据的访问方式,并且可以让类负责同步,而不是让应用程序中的所有代码都尝试正确地同步


此外,您还可以放置一个私有变量作为锁标识符,这样就可以避免使用数据本身作为锁的标识符。通过使用专用的私有变量作为锁标识符,可以消除死锁的一个可能来源。

听起来很有趣。可能对想了解更多的人有用。+1始终是一个非常有用的答案。使用不可变类型听起来很不错。一个“子问题”:C#中的var(匿名类型)是不可变的,不是吗?@TomTom:是的,匿名类型本身在C#中是不可变的。不过在VB中不一定如此(这取决于匿名类型是如何创建的)。@Jon:谢谢你的回答。我把问题放在一个没有答案的状态,给别人写点东西的机会。但是当没有其他东西进来的时候,我会给你荣誉点数。当你回答一个问题时,他们似乎很害怕-P