C#volatile数组项?

时间:2009-12-05 16:47:24

标签: c# .net multithreading arrays volatile

我需要一个包含易失物品的数组,但无法找到方法。

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; }
    }
}

4 个答案:

答案 0 :(得分:7)

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

通过使用volatile了解Thread.MemoryBarrier关键字在幕后工作非常有用。你可以写:

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

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

请注意,volatileMemoryBarrier是易于出错的高级技术。例如,请参阅How do I Understand Read Memory Barriers and Volatile。通常情况下,使用更高级别的结构会更好,例如lockMonitorReaderWriterLockSlim等。

答案 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参数,指针读取/写入。