多线程访问内存

时间:2011-01-14 10:28:47

标签: c# multithreading memory

早上好,

假设我有6个不同的线程,我希望同时与每个线程共享相同的数据。我可以使用我想要共享的数据创建一个类变量,并使每个线程同时访问该内存而不降低性能,或者是否最好将数据的真实副本传递给每个线程?

非常感谢。

1 个答案:

答案 0 :(得分:10)

完全取决于数据;

  • 如果数据是不可变的(或者是可变的但你实际上并没有改变它),那么就把它的所有线程都扔掉 - 很棒
  • 如果你需要改变它,但没有两个线程会依赖于另一个线程突变的数据 - 很棒
  • 如果你需要改变它,并且存在冲突,但你可以明智地同步对数据的访问,这样就不会有两个线程死锁等风险 - 很好,但并不总是微不足道
  • 如果做出任何假设是不安全的,那么数据的真正克隆是最安全的方法,但在数据复制方面具有最大的开销;如果复制数据便宜,这可能没问题 - 实际上可能胜过同步
  • 如果线程相互依赖,那么除了找出某种明智的锁定策略之外别无选择;再次 - 强调:僵局是一个问题 - 一些想法:
    • 获取锁定时始终提供超时
    • 如果您需要锁定两个项目,可能有助于尝试同时锁定 (而不是在开始时锁定一个,而在完成大量更改后锁定另一个) - 然后你
    • 可以简单地释放并重新获取锁定,而无需撤消更改或将更改恢复到特定状态。