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

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

概述环境:.NET 3.5 SP1. 我有两个线程:UI线程和后台工作线程.后台工作线程定期更新共享对象中的某些字段,UI线程会检查它们.没什么了不起的 – 只是进步,回报值和抛出异常.此工作线程在更改这些字段时会在UI线程上(通过Control.BeginInvoke)引发一些事件. 工作线程只写这些字段,UI线程只读它们.它们不用于任何其他通信.为了性能,我想避免锁定共享对象或单个属性.共享对象中 环境:.NET 3.5 SP1.

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

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

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

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

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

总结

以上是内存溢出为你收集整理的.NET:如何确保线程1能够看到线程2在字段中写入的内容?全部内容,希望文章能够帮你解决.NET:如何确保线程1能够看到线程2在字段中写入的内容?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1196399.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存