У меня есть общее поле и свойство, которое его инкапсулирует:
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
старое значение или новое значение.