没有锁定的线程通信

本文关键字:线程 通信 锁定 | 更新日期: 2023-09-27 17:50:53

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

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

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

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

查看这里的MSDN页面锁定,没有找到这样做的方法

没有锁定的线程通信

一如既往,这在很大程度上取决于上下文。

  • 在紧循环中读取的变量可能存储在寄存器或本地缓存中,所以除非你有一个"fence",否则不会注意到任何更改;volatile将解决这个问题,但作为副作用,而不是明确的意图;大多数人(包括我)不能正确地定义volatile 是什么意思 -所以要非常小心地使用它作为"修复"。
  • 一个超大的类型(大结构体)将不是原子的(无论是读还是写)-并且不能在没有撕裂风险的情况下安全地处理
  • 一个对象或值可能包含多个子值;如果不自动更改它们,可能会导致问题

可能会,然而,发现Interlocked解决了您的大多数问题,而不需要lock。同时,一个没有竞争的lock疯狂的快,甚至一个竞争的lock仍然是惊人的快。坦率地说,我不确定它是否值得你这么想:一个平坦的lock几乎肯定足够快,只要你在 lock之外先思考,只有当你知道你想要做的改变时才考虑lock

还有 ReaderWriterLockSlim,但实际上提高性能的情况很少——根据我的经验,最简单的方法通常是最快的,即lockInterlockedReaderWriterLockSlim是一个更复杂的野兽,为更复杂的场景而设计,因此有一点开销。不是大量的,但足以让它值得仔细查看。