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

.NET:如何确保线程1能够看到线程2在字段中写入的内容?

发布时间:2020-12-20 13:20:51 所属栏目:Python 来源:网络整理
导读:环境:.NET 3.5 SP1. 我有两个线程:UI线程和后台工作线程.后台工作线程定期更新共享对象中的某些字段,UI线程会检查它们.没什么了不起的 – 只是进步,回报值和抛出异常.此工作线程在更改这些字段时会在UI线程上(通过Control.BeginInvoke)引发一些事件. 工作
环境:.NET 3.5 SP1.

我有两个线程:UI线程和后台工作线程.后台工作线程定期更新共享对象中的某些字段,UI线程会检查它们.没什么了不起的 – 只是进步,回报值和抛出异常.此工作线程在更改这些字段时会在UI线程上(通过Control.BeginInvoke)引发一些事件.

工作线程只写这些字段,UI线程只读它们.它们不用于任何其他通信.为了性能,我想避免锁定共享对象或单个属性.共享对象中永远不会出现无效状态.

但是我担心处理器缓存和编译器优化等问题.如果在UI线程上的事件处理程序中看不到更新的值,我该如何避免这种情况?将挥发性添加到所有字段是否足够?

解决方法

你没事,不用担心.需要内存屏障来清除对内存的任何挂起写入.有一个隐含的任何锁定语句. Control.Begin / Invoke()需要锁定以保护挂起的委托列表,这样就足够了.

不稳定的要求是一个更难的,主要是因为其确切的语义记录很差.在x86 / x64硬件上,它仅阻止JIT编译器缓存CPU寄存器中变量的值.这不是您的问题,因为委托目标指向一个方法.如果未内联方法,则不会跨方法缓存变量.您的代理目标无法内联.

(编辑:李大同)

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

    推荐文章
      热点阅读