C# 当另一个线程更新int[]数组时,从int[]数组读取是否安全?

C# 当另一个线程更新int[]数组时,从int[]数组读取是否安全?,c#,C#,两条线。 第一次从数组中疯狂读取元素。 第二种方法是通过读取元素并以任意数量递增来更新元素 这安全吗?在这种情况下会出什么差错吗?我不介意读取线程在更新线程仍在更新过程中读取“旧”值。我只想确保读者不会读取未写入的数字,也不会发生异常。这不是线程安全的-不能保证一个线程获得正确的数据。在所有可以执行托管代码的cpu体系结构上,int更新都是原子的。换句话说,您不会读取一个只有一个字节被写入线程修改的值。大于32位的值类型值,如long和double不保证为原子值。对象引用也总是原子的。我已经更新

两条线。 第一次从数组中疯狂读取元素。 第二种方法是通过读取元素并以任意数量递增来更新元素


这安全吗?在这种情况下会出什么差错吗?我不介意读取线程在更新线程仍在更新过程中读取“旧”值。我只想确保读者不会读取未写入的数字,也不会发生异常。

这不是线程安全的-不能保证一个线程获得正确的数据。

在所有可以执行托管代码的cpu体系结构上,int更新都是原子的。换句话说,您不会读取一个只有一个字节被写入线程修改的值。大于32位的值类型值,如
long
double
不保证为原子值。对象引用也总是原子的。

我已经更新以解释我不想发生的事情,也不会例外。如果可能发生“半写”更新,也不会有例外,而这是不可能的。您是否要求同时读取数组的第三个线程看到其他两个线程操作的一致顺序?因为C#内存模型不能保证这一点而不引入障碍。但是你能保证读取线程将读取新的或旧的数据,而不是其他一些不相关的数据吗?他似乎并不关心陈旧的读取,只关心潜在的运行时异常,让我担心这个实现会发生在什么地方。别担心,普雷斯顿,这只是我为在我们核电站周围飞行的飞机编写的一些自动驾驶仪代码。如果是这样,我建议完全取消阵列,每次调用时都返回Rand.Next()。
long
必须是x86-64上的原子,内存指针也是atomic@SargeBorsch:挑剔:C语言保证指针和引用在对齐时在所有体系结构上都是原子的。尽管运行时或硬件可以保证长时间运行,但C#语言不能。