数组指针线程安全

hl3*_*kel 2 c# arrays thread-safety

让我们假设我们在C#中有一个从mutliple线程访问的数组,在运行时更改这个数组是否可以安全?(不是改变其数据,而是改变指针).换句话说,正在编写一个数组指针进行原子操作吗?

Wil*_*sem 6

写入新指针的地址是一个原子操作:

5.5变量引用的原子性

以下数据类型的读取和写入是原子的:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型.此外,在先前列表中具有基础类型的枚举类型的读取和写入也是原子的.其他类型的读写,包括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;
    }

}
Run Code Online (Sandbox Code Playgroud)

假设您将data数组设置为具有不同长度的数组,则for-loop 可能会检查长度获取旧数组的长度,然后将引用修改为较短的数组,然后访问非法索引.

因此,非阻塞多线程应用程序会复制对数组的引用,修改数组,然后检查引用是否被修改.