Где InterlockedRead?

sed -n '16224,16482p' < dump.sql

19
задан Ian Boyd 13 February 2018 в 14:37
поделиться

3 ответа

Обычным способом реализации этого является использование операции сравнения-обмена (например, InterlockedCompareExchange64 ), где оба значения одинаковы. У меня есть скрытое подозрение, что это может быть выполнено более эффективно, чем добавление 0 по какой-то причине, но у меня нет доказательств, подтверждающих это.

Интересно, что класс .NET Interlocked не получил Читать метод до .NET 2.0. Я считаю, что Interlocked.Read реализован с использованием Interlocked.CompareExchange . (Обратите внимание, что документация для Interlocked.Read кажется мне несколько вводящей в заблуждение - в ней говорится об атомарности, но не о волатильности, что означает нечто очень специфическое для .NET. I '

8
ответ дан 30 November 2019 в 05:01
поделиться

Вы можете только распаковать тип значения в его исходный тип (и версию с нулевым значением такого типа).

Между прочим, это действительно так (просто сокращение для вашей двухстрочной версии): что может привести к потере этого выравнивания. Это атрибуты специально для этой цели, поэтому, если вы не собираетесь изменять макет, это не должно относиться к вам.

С учетом этого, цель класса Interlocked - для обеспечения операций, которые (перефразируя) можно наблюдать только в их состоянии «до» или «после». Заблокированные операции обычно вызывают беспокойство только при изменении памяти (как правило, каким-то нетривиальным способом сравнения-обмена). Как указано в статье MSDN, которую вы нашли, операции чтения (при правильном выравнивании) могут всегда считаться атомарными без дополнительных мер предосторожности.

Однако есть и другие соображения при работе с операциями чтения:

  • На современных процессорах, хотя чтение может быть атомарным, он также может возвращать неправильное значение из устаревшего кеша где-то ... именно здесь вам может потребоваться сделать поле "изменчивым", чтобы получить ожидаемое поведение
  • Если вы имеете дело с 64-битным значением на 32-битной системе. битовое оборудование, вам может потребоваться использовать операцию Interlocked.Read , чтобы гарантировать, что целое 64-битное значение считывается за одну атомарную операцию (в противном случае это может быть выполнено как 2 отдельных 32 -битовые чтения, которые могут выполняться с любой стороны обновления памяти)
  • Изменение порядка чтения / записи может привести к тому, что вы не получите ожидаемого значения; в этом случае может потребоваться некоторый барьер памяти (либо явный, либо посредством использования операций класса Interlocked )

Краткое описание ; что касается атомарности,

2
ответ дан 30 November 2019 в 05:01
поделиться

Я думаю, что ваша интерпретация слова «несинхронизировано» неверна. Простое чтение является атомарным, но вы должны сами позаботиться о переупорядочении и проблемах видимости памяти. Первое обрабатывается с помощью инструкций ограждения в соответствующих местах, второе не является проблемой при чтении (но потенциальная одновременная запись должна обеспечивать надлежащую видимость, а функции Interlocked должны делать if ] они отображаются в LOCKED asm-инструкции).

7
ответ дан 30 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: