C#volatile数组项?

DxC*_*xCK 14 .net c# arrays multithreading volatile

我需要一个包含volatile项的数组,并且找不到这样做的方法.

private volatile T[] _arr;
Run Code Online (Sandbox Code Playgroud)

这意味着_arr引用是易失性的,但它不保证_arr对象本身内部的任何内容.

有没有办法将_arr的Items标记为volatile?

谢谢.

编辑:

以下代码根据二进制编码的答案构建.这段代码是否可以使用线程安全?

public class VolatileArray<T>
{
    private T[] _arr;

    public VolatileArray(int length)
    {
        _arr = new T[length];
    }

    public VolatileArray(T[] arr)
    {
        _arr = arr;
    }

    public T this[int index]
    {
        get
        {
            T value = _arr[index];
            Thread.MemoryBarrier();
            return value;
        }

        set
        {
            Thread.MemoryBarrier();
            _arr[index] = value;
        }
    }

    public int Length
    {
        get { return _arr.Length; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*aty 8

由于可以通过引用传递数组元素,因此可以使用Thread.VolatileReadThread.VolatileWrite.

通过使用来了解volatile关键字在幕后工作是很有用的Thread.MemoryBarrier.你可以写:

// Read
x = _arr[i];
Thread.MemoryBarrier();

// Write
Thread.MemoryBarrier();
_arr[i] = x;
Run Code Online (Sandbox Code Playgroud)

需要注意的是volatileMemoryBarrier是既容易出错的先进技术.例如,请参阅如何理解读取内存屏障和易失性.通常你是关闭与更高级别的结构,如更好lock,Monitor,ReaderWriterLockSlim,等.


Oma*_*riO 6

使用Volatile.Read(ref array[index])Volatile.Write(ref array[index], value).

该类Volatile自 .NET 4.5 起可用。它允许从字段、数组元素、ref参数、指针读取/写入。

  • @EugeneBeresovsky 他明确表示他需要对数组项进行易失性访问。 (3认同)