Резьба -безопасное универсальное поле

У меня есть общее поле и свойство, которое его инкапсулирует:

T item;

public T Item
{
    get { return item; }
    set { item = value; }
}

Проблема в том, что это свойство может быть записано из одного потока и прочитано из нескольких потоков одновременно. И если Tявляется structили long, читатели могут получить результаты, которые являются частично старым значением и частично новым значением. Как я могу предотвратить это?

Я пытался использовать volatile, но это невозможно :

A volatile field cannot be of the type 'T'.

. Так как это более простой случай кода, который я уже написал, который использует ConcurrentQueue<T>, я подумал о том, чтобы использовать его и здесь :

ConcurrentQueue<T> item;

public T Item
{
    get
    {
        T result;
        item.TryPeek(out result);
        return item;
    }

    set
    {
        item.TryEnqueue(value);
        T ignored;
        item.TryDequeue(out ignored);
    }
}

. Это сработает, но мне кажется, что это слишком сложное решение того, что должно быть простым.

Производительность важна, поэтому по возможности следует избегать блокировки.

Если setпроисходит одновременно с get, мне все равно, возвращает ли getстарое значение или новое значение.

5
задан svick 18 July 2012 в 15:01
поделиться