3

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

如果是这样,我可以在不锁定变量的情况下摆脱那个特技吗?

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

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

在这里查看有关锁定的 MSDN 页面,但没有看到这样做的方法。

4

1 回答 1

12

与往常一样,这在很大程度上取决于上下文。

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

但是,您可能会发现Interlocked无需lock. 同时,无竞争者的速度快得离谱,甚至有lock竞争者的速度也快得惊人。坦率地说,我不确定你给出的想法是否值得:一个单位几乎可以肯定是足够快的,只要你首先在外面做想法,只有当你知道你想要做的改变时.locklocklocklock

也有 ReaderWriterLockSlim但实际上提高性能的情况很少 - 根据我的经验,最简单的方法通常是最快的,意思是要么lock要么InterlockedReaderWriterLockSlim是一个更复杂的野兽,专为更复杂的场景而设计,因此有一点开销。数量不多,但足以让它值得仔细观察

于 2013-01-07T21:47:39.710 回答