как выполнить атомарное чтение для двойного?

Почему для double нет функции Interlocked.Read, поскольку для double доступны методы Interlocked.Exchange и Interlocked.CompareExchange, которые могут выполнять более сложные функции атомарно. Использование таких методов для атомарного чтения двойного значения (вместо использования Interlocked.Read) добавит накладные расходы на простую операцию чтения.

Не могли бы вы предложить более простой подход к атомарному чтению двойника, когда другой поток обновляет этот двойник, используя метод Interlocked.Exchange.


person Alok    schedule 14.07.2014    source источник
comment
если другой поток обновляет это двойное значение, какое значение вы ожидаете получить? старое значение или новое значение?   -  person Mitch Wheat    schedule 14.07.2014
comment
@MitchWheat, разве операция обновления другого потока не должна быть заблокирована до тех пор, пока не будет выполнена операция чтения текущего потока?   -  person Tony    schedule 14.07.2014
comment
хотите прочитать новое значение.   -  person Alok    schedule 14.07.2014
comment
@Tony: плакат, кажется, просит что-то быстро. При повторном прочтении я понятия не имею, что они просят! --› ... добавит накладные расходы на простую операцию чтения - Да, блокировка связана с накладными расходами...   -  person Mitch Wheat    schedule 14.07.2014
comment
@MitchWheat извините за путаницу в вопросе. Я имел в виду накладные расходы по сравнению с операцией Interlocked.Read. Я создаю временную переменную и использую Interlocked.Exchange для атомарного чтения двойного значения и возврата временного значения. Простой метод Interlocked.Read кажется намного проще, чем метод Interlocked.Exchange. Есть предположения?   -  person Alok    schedule 14.07.2014
comment
Это вызывает узкое место? Если нет, займитесь чем-то более важным....   -  person Mitch Wheat    schedule 14.07.2014
comment
не узкое место, но меня больше интересует правильность. Что я хотел знать, так это то, что когда поток обновляет двойное значение с помощью Interlocked.Exchange, другой поток не может просто нормально прочитать двойное значение без потери атомарности. Он должен сохранить значение во временном двойнике с помощью Interlocked.Exchange и использовать временное значение.   -  person Alok    schedule 14.07.2014


Ответы (1)


Interlocked.Read для long реализуется следующим образом:

return Interlocked.CompareExchange(ref location,0,0);

Это означает, что использование CompareExchange вместо Read не добавляет накладных расходов ни для long, ни для double.

person Martin    schedule 12.07.2019