线程通信而不锁定

时间:2013-01-07 21:42:02

标签: c# locking

如果我可以保证自己整个应用程序中只有一种方法可以写入某个变量,那么我可以允许我的应用程序中的其他方法安全地读取该值吗?

如果是这样,我可以在不锁定变量的情况下逃脱该噱头吗?

在这种情况下,我正在做(或者,尝试做或想要做)是一个线程中的一个方法将值放入变量,然后其他线程中的其他方法将读取该值并做出决定。

一个非常好的选择是锁定写入,同时允许读取。

在这里查看MSDN page on lock并没有找到办法做到这一点。

1 个答案:

答案 0 :(得分:12)

与往常一样,它在很大程度上取决于背景。

  • 在紧密循环中读取的变量可以存储在寄存器或本地缓存中,因此除非您有“栅栏”,否则不会发现任何变化; volatile会解决这个问题,但是作为副作用而不是明确的意图;大多数人(包括我)无法正确定义volatile 的含义 - 所以要非常小心地将其用作“修复”。
  • 超大型(大型结构)不会是原子的(用于读取或写入) - 并且无法在没有撕裂风险的情况下安全处理
  • 对象或值可能涉及多个子值;如果他们没有原子地改变,它可能会导致问题

但是,Interlocked可以在不需要lock的情况下解决大部分问题。与此同时,一个无可争议的lock 疯狂快,甚至有争议的lock仍然惊人地快。坦率地说,我不确定你给它的想法是否值得:平坦的lock几乎肯定是足够快的,只要你先思考在外面 { {1}},当您知道要进行的更改时,只有lock

还有 lock,但实际上提高性能的案例数量很少 - 根据我的经验,最简单的方法通常是最快,意味着ReaderWriterLockSlimlockInterlocked是一个更复杂的野兽,专为更复杂的场景而设计,因此具有一点开销。不是大量的金额,但足以让它值得仔细查看。