我需要一个包含易失物品的数组,但无法找到方法。
private volatile T[] _arr;
这意味着_arr引用是volatile,但它不保证_arr对象本身内部的任何内容。
有没有办法将_arr的项目标记为易变?
感谢。
修改
根据二进制编码的答案构建以下代码。 这段代码是否可以使用线程安全?
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; }
}
}
答案 0 :(得分:7)
由于可以通过引用传递数组元素,因此您可以使用Thread.VolatileRead
和Thread.VolatileWrite
。
通过使用volatile
了解Thread.MemoryBarrier
关键字在幕后工作非常有用。你可以写:
// Read
x = _arr[i];
Thread.MemoryBarrier();
// Write
Thread.MemoryBarrier();
_arr[i] = x;
请注意,volatile
和MemoryBarrier
是易于出错的高级技术。例如,请参阅How do I Understand Read Memory Barriers and Volatile。通常情况下,使用更高级别的结构会更好,例如lock
,Monitor
,ReaderWriterLockSlim
等。
答案 1 :(得分:1)
我认为你不能
您不能,volatile
被定义为字段修饰符(ECMA 334)。
我认为它也不会达到你想要的效果 考虑:
private T[] _arr;
volatile T v;
.... v = _arr[x];
.... _arr[x] = v;
答案 2 :(得分:1)
我做了一个小结构,有助于保持清洁和OO
struct VolatileBoolean {
public volatile Boolean Value;
}
VolatileBoolean[] arrayOfVolatileBooleans;
public void SomeMethod() {
if (arrayOfVolatileBooleans[4].Value)
DoSomething();
}
答案 3 :(得分:1)
使用SELECT * FROM teachers WHERE WEEKOFYEAR(birthday) = WEEKOFYEAR(NOW())
和Volatile.Read(ref array[index])
。
自.NET 4.5以来,类Volatile.Write(ref array[index], value)
可用。它允许从/向字段,数组元素,Volatile
参数,指针读取/写入。