加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 线程无锁定通信

发布时间:2020-12-16 00:06:29 所属栏目:百科 来源:网络整理
导读:如果我可以保证自己整个应用程序中只有一种方法可以写入某个变量,那么我可以允许我的应用程序中的其他方法安全地读取该值吗? 如果是这样,我可以在不锁定变量的情况下逃脱这个特技吗? 在这种情况下,我正在做(或者,尝试做或想要做)是一个线程中的一个方法将
如果我可以保证自己整个应用程序中只有一种方法可以写入某个变量,那么我可以允许我的应用程序中的其他方法安全地读取该值吗?

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

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

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

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

解决方法

一如既往,它在很大程度上取决于背景.

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

但是,您可能会发现Interlocked可以在不需要锁定的情况下解决您的大部分问题.与此同时,无争议的锁定速度非常快,甚至有争议的锁定速度仍然非常快.坦率地说,我不确定你给它的想法是否值得:平锁几乎肯定足够快,只要你先在锁外做思考,只有当你知道改变时才锁定它想做.

还有ReaderWriterLockSlim,但实际上提高性能的案例数量很少 – 根据我的经验,最简单的方法通常是最快的,即锁定或互锁. ReaderWriterLockSlim是一个更复杂的野兽,专为更复杂的场景而设计,因此具有一点开销.数量不大,但足以让它值得仔细观察.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读