17

揮発性アイテムを含む配列が必要ですが、それを行う方法が見つかりません。

private volatile T[] _arr;

これは、_arr 参照が揮発性であることを意味しますが、_arr オブジェクト自体の内部の項目については何も保証しません。

_arr の項目を揮発性としてマークする方法はありますか?

ありがとう。

編集:

Binarycoder の回答に従って構築された次のコード。このコードはスレッドセーフで使用できますか?

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

4 に答える 4

11

Thread.VolatileRead配列要素は参照渡しが可能なので、 andが使えますThread.VolatileWrite

volatileを使用して、キーワードが舞台裏で機能することを理解しておくと役立ちThread.MemoryBarrierます。あなたは書くことができます:

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

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

volatileMemoryBarrierはどちらも間違いやすい高度なテクニックであることに注意してください。たとえば、読み取りメモリ バリアと揮発性を理解する方法を参照してください。lock通常、Monitor、 、などの高レベルの構造を使用する方が適切ですReaderWriterLockSlim

于 2009-12-05T17:05:46.043 に答える
4

とを使用Volatile.Read(ref array[index])Volatile.Write(ref array[index], value)ます。

クラスVolatileは .NET 4.5 以降で使用できます。refフィールド、配列要素、パラメーター、ポインターの読み取り/書き込みが可能です。

于 2016-07-15T15:31:23.230 に答える
2

私はあなたができるとは思わない

できませんvolatile。フィールド修飾子 (ECMA 334) として定義されています。

そして、それがあなたが望むことも達成するとは思いません。
検討:

 private T[] _arr;

 volatile T v;
 ....  v = _arr[x];
 ....  _arr[x] = v;
于 2009-12-05T16:54:32.527 に答える
2

物事をきれいに保ち、オブジェクト指向を維持するのに役立つ小さな構造体を作成しました

struct VolatileBoolean {
    public volatile Boolean Value;
}

VolatileBoolean[] arrayOfVolatileBooleans;
public void SomeMethod() {
    if (arrayOfVolatileBooleans[4].Value)
        DoSomething();
}
于 2013-03-22T15:29:53.423 に答える