问题
I need an array with volatile items, and can't find a way to do that.
private volatile T[] _arr;
This means that the _arr reference is volatile, however it does not guarantee anything about the items inside the _arr object itself.
Is there any way to mark the _arr's Items as volatile?
Thanks.
EDIT:
The following code built according to binarycoder's answer. Is this code thread-safe to use?
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; }
}
}
回答1:
Since it is possible to pass array elements by reference, you can use Thread.VolatileRead and Thread.VolatileWrite.
It is useful to understand that the volatile keyword works behind the scenes by using Thread.MemoryBarrier. You could write:
// Read
x = _arr[i];
Thread.MemoryBarrier();
// Write
Thread.MemoryBarrier();
_arr[i] = x;
Note that volatile and MemoryBarrier are advanced techniques that are both easy to get wrong. For example, see How do I Understand Read Memory Barriers and Volatile. Usually you are better off with higher level constructs such as lock, Monitor, ReaderWriterLockSlim, and others.
回答2:
Use Volatile.Read(ref array[index]) and Volatile.Write(ref array[index], value).
Class Volatile is available since .NET 4.5. It allows to read/write from/to fields, array elements, ref parameters, pointers.
回答3:
I don't think that you can
You can't, volatile is defined as a field-modifier (ECMA 334).
And I don't think it will accomplish what you want either.
Consider:
private T[] _arr;
volatile T v;
.... v = _arr[x];
.... _arr[x] = v;
回答4:
I made a little struct that helps keep things clean and OO
struct VolatileBoolean {
public volatile Boolean Value;
}
VolatileBoolean[] arrayOfVolatileBooleans;
public void SomeMethod() {
if (arrayOfVolatileBooleans[4].Value)
DoSomething();
}
来源:https://stackoverflow.com/questions/1852695/c-sharp-volatile-array-items