线程安全和类方法参数

mig*_*uel 2 c# multithreading

请使用以下代码:

 public void SomeMethodWithParameters(MutableObject mutableParameter, String stringParameter, double structParameter)
    {
       // some code
    }
Run Code Online (Sandbox Code Playgroud)

我的理解是,由于mutableParameter在此方法之外是可更改的,因此该代码不是线程安全的.

您在代码中使用了哪些策略(除了仅使用不可变类或结构作为参数)以防止这种可能性?是否所有传递给该方法的对象实际上都是深度克隆?

Eri*_*ert 9

我的理解是,由于mutableParameter在此方法之外是可更改的,因此该代码不是线程安全的.

澄清一下:变量 "mutableParameter" 的内容不会改变; 该变量将在其整个生命周期中引用相同的实例(前提是您不在方法中更改它).如果引用同一对象的某个其他线程正在改变它们,则所引用的实例所拥有的变量的内容可能会发生变化.

您在代码中使用了哪些策略(除了仅使用不可变类或结构作为参数)以防止这种可能性?

如果可能,请完全避免此问题.首先,不要在多个线程上读取和写入同一对象的相同变量.

如果你无法避免它,那么制作一个适当的访问锁对象.

定义一个锁定协议,以便您在访问可以在另一个线程上访问的任何变量之前保证锁定该对象.完成后解锁它.

  • 确保订购锁以防止死锁.
  • 锁定对象应尽可能无法访问.私人比内部更好,内部更好,比公共更好.永远不要选择像锁物一样的东西; 你无法控制谁以什么顺序锁定它,因此你有潜在的死锁.
  • 确保每个线程上对变量的每次访问遵循协议.锁定100次访问中的99次并且在没有锁定的情况下让第100次进入是没有任何好处的.如果您无法阻止您无法控制访问资源的代码,那么需要重写资源本身以使其成为线程安全的.
  • 测量您的性能并查看锁争用的频率.如果锁定存在争议,请更改您的体系结构以防止争用.只有你绝对肯定有一个严重的问题,如果你尝试无锁或低锁解决方案,你无法以其他方式做得更好.

  • @Joan:我远非专家; 我知道我知道自己知之甚少!麻烦的是大多数尝试编写多线程代码的人甚至都不知道.我想如果你等待更好的事情,你可以等待很长时间; 也就是说,如果你有一个需要并发,并行或异步的问题,那么一定要采用比"线程"更高级别的抽象.例如,任务并行库擅长抽象出线程管理问题. (2认同)
  • @Greg:我不知道有什么这样的事情.带有锁的多线程,其中线程可以相互等待,这要求程序员全面了解整个系统的可能锁定状态; 这就是它如此艰难的原因.坦率地说,我不是很擅长.我倾向于把这些东西留给专家. (2认同)