.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寄存器中变量的值.这不是您的问题,因为委托目标指向一个方法.如果未内联方法,则不会跨方法缓存变量.您的代理目标无法内联. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- python – OptionParser – 支持命令行末尾的任何选项
- python实现购物车流程,要求:1.显示物品编号、名称、价格;
- Python PANDAS写入csv:如何设置小数点(“.”或“,”)?
- Django 根据数据模型models创建数据表的实例
- python – 函数int()向负无穷大(floor)舍入或为零?
- python – 如何使用多个服务器进行Flask登录
- Python:Beautifulsoup返回None或[]
- 如何使用SQLAlchemy在Flask中执行原始sql查询和使用模型对象
- python – 使用pyodbc创建数据库
- Python中断言Assertion的一些改进方案