繁体   English   中英

数组指针线程安全

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM