gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:43:56 25 4
gpt4 key购买 nike

环境:.NET 3.5 SP1。

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

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

但是,我担心处理器缓存和编译器优化之类的事情。如何避免在 UI 线程的事件处理程序中不可见更新值的情况?将添加 volatile到所有领域就够了吗?

最佳答案

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

volatile 要求是一个更难的要求,主要是因为它的确切语义记录得很少。在 x86/x64 硬件上,它只是阻止 JIT 编译器在 CPU 寄存器中缓存变量的值。在您的情况下,这不是问题,因为委托(delegate)目标指向一个方法。如果方法未内联,则变量不会跨方法缓存。您的委托(delegate)目标不能被内联。

关于.NET:如何确保线程 1 可以看到线程 2 在字段中写入的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com