Обычным способом реализации этого является использование операции сравнения-обмена (например, InterlockedCompareExchange64
), где оба значения одинаковы. У меня есть скрытое подозрение, что это может быть выполнено более эффективно, чем добавление 0 по какой-то причине, но у меня нет доказательств, подтверждающих это.
Интересно, что класс .NET Interlocked
не получил Читать метод
до .NET 2.0. Я считаю, что Interlocked.Read
реализован с использованием Interlocked.CompareExchange
. (Обратите внимание, что документация для Interlocked.Read
кажется мне несколько вводящей в заблуждение - в ней говорится об атомарности, но не о волатильности, что означает нечто очень специфическое для .NET. I '
Вы можете только распаковать тип значения в его исходный тип (и версию с нулевым значением такого типа).
Между прочим, это действительно так (просто сокращение для вашей двухстрочной версии): что может привести к потере этого выравнивания. Это атрибуты специально для этой цели, поэтому, если вы не собираетесь изменять макет, это не должно относиться к вам.
С учетом этого, цель класса Interlocked
- для обеспечения операций, которые (перефразируя) можно наблюдать только в их состоянии «до» или «после». Заблокированные операции обычно вызывают беспокойство только при изменении памяти (как правило, каким-то нетривиальным способом сравнения-обмена). Как указано в статье MSDN, которую вы нашли, операции чтения (при правильном выравнивании) могут всегда считаться атомарными без дополнительных мер предосторожности.
Однако есть и другие соображения при работе с операциями чтения:
Interlocked.Read
, чтобы гарантировать, что целое 64-битное значение считывается за одну атомарную операцию (в противном случае это может быть выполнено как 2 отдельных 32 -битовые чтения, которые могут выполняться с любой стороны обновления памяти) Interlocked
) Краткое описание ; что касается атомарности,
Я думаю, что ваша интерпретация слова «несинхронизировано» неверна. Простое чтение является атомарным, но вы должны сами позаботиться о переупорядочении и проблемах видимости памяти. Первое обрабатывается с помощью инструкций ограждения в соответствующих местах, второе не является проблемой при чтении (но потенциальная одновременная запись должна обеспечивать надлежащую видимость, а функции Interlocked должны делать if ] они отображаются в LOCKED asm-инструкции).