gpt4 book ai didi

c# - 在哪些 CPU 架构上使用 CLR(和变体)写入 int "implicitly volatile"?

转载 作者:行者123 更新时间:2023-11-30 14:57:45 24 4
gpt4 key购买 nike

我最近学习了here以下是使用 x86 CLR(不一定是 ECMA 标准 CLR)的 x86 CPU 上的线程安全

public class SometimesThreadSafe
{
private int value;
public int Value { get { return value; } }

public void Update()
{
Interlocked.Add(ref value, 47);
}
}

这是因为在此类架构上写入 int 可确保同步任何其他 CPU 缓存值。 然而,在 ARM CPU 上,这不是线程安全的!因为从不同线程读取值可能会从 CPU 缓存读取旧副本。

所以问题在于什么 CPU 架构以及什么版本的 CLR 及其变体,例如Mono,这是线程安全的吗?

最佳答案

“线程安全”并不是适用于此类代码的恰当词。对 Value 属性 getter 的访问与 Update() 方法完全不同步,因此您获得的值是完全不可预测的。包括从未看到更新。

如果 Value 属性 getter 是atomic,您在这里唯一关心的是。换句话说,如果您能够观察到属性的部分更新值,其中一些字节将被 Update() 更改,而另一些则不会。 CLI 规范保证了这一点。 Ecma-335,第 I.12.6.6 节,“原子读写”:

A conforming CLI shall guarantee that read and write access to properly aligned memory locations no larger than the native word size (the size of type native int) is atomic (see §I.12.6.2) when all the write accesses to a location are the same size. Atomic writes shall alter no bits other than those written. Unless explicit layout control (see Partition II (Controlling Instance Layout)) is used to alter the default behavior, data elements no larger than the natural word size (the size of a native int) shall be properly aligned. Object references shall be treated as though they are stored in the native word size.

此保证在 C# 语言规范第 5.5 章“变量引用的原子性”中有所缓和。它避免依赖于 IntPtr 的大小:

Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic.

无论如何,int任何 架构上都不是问题。

如果您真的关心线程安全,那么这段代码就完全错误了。它在任何 架构上都不是线程安全的。 .NET 内存模型中不存在“隐式 volatile ”的概念。 x86 抖动优化器利用了一些东西,它将属性的支持字段存储在 cpu 寄存器中,而不是从内存中更新它。你永远不会观察到更新。需要显式声明 volatile 才能抑制此优化。

关于c# - 在哪些 CPU 架构上使用 CLR(和变体)写入 int "implicitly volatile"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20345756/

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