C# volatile array items?

时光总嘲笑我的痴心妄想 提交于 2019-12-21 03:48:30

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!