2009-12-05 15 views
9

Necesito una matriz con elementos volátiles y no puedo encontrar la forma de hacerlo.C# elementos de matriz volátil?

private volatile T[] _arr; 

Esto significa que la referencia _arr es volátil, sin embargo, no garantiza nada acerca de los elementos dentro del propio objeto _arr.

¿Hay alguna manera de marcar los elementos del disco como volátiles?

Gracias.

EDIT:

El siguiente código construido de acuerdo a la respuesta de BinaryCoder. ¿Este código es seguro para la ejecución de subprocesos?

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

Esta pregunta necesita más amor. –

Respuesta

7

Dado que es posible pasar elementos de la matriz por referencia, puede utilizar Thread.VolatileRead y Thread.VolatileWrite.

Es útil comprender que la palabra clave volatile funciona entre bastidores usando Thread.MemoryBarrier. Se puede escribir:

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

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

Tenga en cuenta que volatile y MemoryBarrier son técnicas avanzadas que son a la vez fácil equivocarse. Por ejemplo, vea How do I Understand Read Memory Barriers and Volatile. Usualmente está mejor con construcciones de nivel superior como lock, Monitor, ReaderWriterLockSlim, y otras.

+0

IIRC, luego estrictamente, la palabra clave 'volátil' solo conlleva una barrera de lectura o escritura, según corresponda, mientras que' Thread.MemoryBarrier() 'tiene una barrera completa. Por lo tanto, lo anterior es un poco más pesado que el uso equivalente de 'volátil 'incluso antes de considerar que implica una llamada a un método. Sigue siendo lo mejor que podemos hacer (y como dices, la implementación actual de 'VolatileRead()' y 'VolatileWrite()'). –

1

No creo que se puede

Puede no, volatile se define como un campo modificador (ECMA 334).

Y no creo que logre lo que quiere tampoco.
considerar:

private T[] _arr; 

volatile T v; 
.... v = _arr[x]; 
.... _arr[x] = v; 
1

hice un poco de estructura que ayuda a mantener las cosas limpias y OO

struct VolatileBoolean { 
    public volatile Boolean Value; 
} 

VolatileBoolean[] arrayOfVolatileBooleans; 
public void SomeMethod() { 
    if (arrayOfVolatileBooleans[4].Value) 
     DoSomething(); 
} 
2

Uso Volatile.Read(ref array[index]) y Volatile.Write(ref array[index], value).

La clase Volatile está disponible desde .NET 4.5. Permite leer/escribir desde/a campos, elementos de matriz, ref parámetros, punteros.