我有两个线程:UI线程和后台工作线程.后台工作线程定期更新共享对象中的某些字段,UI线程会检查它们.没什么了不起的 – 只是进步,回报值和抛出异常.此工作线程在更改这些字段时会在UI线程上(通过Control.BeginInvoke)引发一些事件.
工作线程只写这些字段,UI线程只读它们.它们不用于任何其他通信.为了性能,我想避免锁定共享对象或单个属性.共享对象中永远不会出现无效状态.
但是我担心处理器缓存和编译器优化等问题.如果在UI线程上的事件处理程序中看不到更新的值,我该如何避免这种情况?将挥发性添加到所有字段是否足够?
解决方法 你没事,不用担心.需要内存屏障来清除对内存的任何挂起写入.有一个隐含的任何锁定语句. Control.Begin / Invoke()需要锁定以保护挂起的委托列表,这样就足够了.不稳定的要求是一个更难的,主要是因为其确切的语义记录很差.在x86 / x64硬件上,它仅阻止JIT编译器缓存cpu寄存器中变量的值.这不是您的问题,因为委托目标指向一个方法.如果未内联方法,则不会跨方法缓存变量.您的代理目标无法内联.
总结以上是内存溢出为你收集整理的.NET:如何确保线程1能够看到线程2在字段中写入的内容?全部内容,希望文章能够帮你解决.NET:如何确保线程1能够看到线程2在字段中写入的内容?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)