gpt4 book ai didi

c# - 线程在没有锁定的情况下进行通信

转载 作者:行者123 更新时间:2023-11-30 13:27:08 25 4
gpt4 key购买 nike

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

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

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

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

看这里MSDN page on lock并且没有找到这样做的方法。

最佳答案

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

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

但是,您可能会发现Interlocked 无需 即可解决大部分问题。同时,未竞争的 lock 速度疯狂,即使是竞争的 lock 仍然惊人地 快。坦率地说,我不确定您的想法是否值得:只要您首先在外面锁 几乎肯定足够快> lock,只有在知道要进行的更改时才lock

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

关于c# - 线程在没有锁定的情况下进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com