【发布时间】:2022-01-14 03:28:02
【问题描述】:
我读了C# Events and Thread Safety 以及MSDN
中的线程安全委托调用部分在问问题之前,我定义线程安全,有三个方面:
- (item1) 无错误数据 R/W。 (中间数据)
- (item2)指令重编没有影响。
- (item3)缓存一致性没有影响。
让我们再看一下这个例子:
PropertyChanged?.Invoke(…)
var handler = this.PropertyChanged;
if (handler != null)
{
handler(…);
}
好的,在 C# 中,引用类型的 R/W OP 不是坏数据问题。因此,当调用处理程序时,它永远不会为空。 但是,我还有疑问
- C#底层是否有机制保证一个联锁的API操作实际应用到PropertyChanged,所以指令重排序不会有问题缓存一致性。
- 如果确实有类似的互锁机制,是不是只针对委托和事件类型?对于可以使用的其他变量类型是否有这样的保证。?运算符。
【补充】
是的,我无法定义线程安全的含义。我只想给 item1-item3 一个 NAME。我的另一个疑问来自以下 使用 Interlocked.CompareExchange 实现的类似字段的事件
什么叫线程安全? 到目前为止我们得到的代码是 “线程安全”,因为其他线程做什么并不重要——你 不会从上面的代码中得到 NullReferenceException。然而,如果 其他线程正在订阅或取消订阅该事件, 由于正常原因,您可能看不到最近的更改 内存模型很复杂。
从 C# 4 开始,类似字段的事件是使用 Interlocked.CompareExchange,所以我们可以使用对应的 Interlocked.CompareExchange 调用以确保我们获得最新的 价值。诚然,能够做到这一点并不是什么新鲜事, 但这确实意味着我们可以写
【问题讨论】:
-
“我定义了线程安全”——这完全无关紧要。该文档有一个线程安全的定义。你如何重新定义它 - 与现实无关。
-
“一个联锁的 API 操作实际上应用于 PropertyChanged”——不需要这样的事情。在单个执行线程中,重新排序操作以使您在分配变量之前尝试访问它是无效的。
标签: c# thread-safety clr