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)
由于可以通过引用传递数组元素,因此可以使用Thread.VolatileRead和Thread.VolatileWrite.
通过使用来了解volatile关键字在幕后工作是很有用的Thread.MemoryBarrier.你可以写:
// Read
x = _arr[i];
Thread.MemoryBarrier();
// Write
Thread.MemoryBarrier();
_arr[i] = x;
Run Code Online (Sandbox Code Playgroud)
需要注意的是volatile和MemoryBarrier是既容易出错的先进技术.例如,请参阅如何理解读取内存屏障和易失性.通常你是关闭与更高级别的结构,如更好lock,Monitor,ReaderWriterLockSlim,等.
使用Volatile.Read(ref array[index])和Volatile.Write(ref array[index], value).
该类Volatile自 .NET 4.5 起可用。它允许从字段、数组元素、ref参数、指针读取/写入。
| 归档时间: |
|
| 查看次数: |
2899 次 |
| 最近记录: |