[英]Array Pointer thread safety
假设我们有一个C#数组,可以从多个线程访问该数组,那么在运行时更改该数组是否安全? (不是更改其数据,而是更改指针)。 换句话说,编写数组指针是原子操作吗?
编写新指针的地址是一个原子操作:
5.5变量引用的原子性
下列数据类型的读写是原子的:bool,char,byte,sbyte,short,ushort,uint,int,float和引用类型。 此外,上一个列表中具有基础类型的枚举类型的读取和写入也是原子的。 不保证其他类型的读取和写入(包括long,ulong,double和decimal)以及用户定义的类型都是原子的。
由于数组指针是引用,因此它是线程安全的。
为了避免缓存的副作用 ,您也可以使用volatile
关键字。
但是,您必须对此非常谨慎。 说您有一种方法:
public class Foo {
private volatile int[] data;
public void Method () {
for(int i = 0; i < data.length; i++) {
data[i] = i;
}
}
public void OtherMethod (int[] data) {
this.data = data;
}
}
假设您将data
数组设置为不同长度的数组,则for
-loop可能会检查长度以获取旧数组的长度,然后将引用修改为较短的数组,然后访问非法索引。
因此,非阻塞多线程应用程序将引用复制到数组,修改数组,然后检查引用是否被修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.