Почему в C# Thread.MemoryBarrier() используется «lock or» вместо mfence?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему в C# Thread.MemoryBarrier() используется «lock or» вместо mfence?

Сообщение Anonymous »

Я читал старую документацию MS, Модель памяти C# в теории и практике, часть 2, и мне было интересно прочитать:

Одно из возможных исправлений: чтобы вставить барьер памяти как в ThreadA, так и в ThreadB... JIT CLR вставит инструкцию «lock or» вместо барьера памяти. Заблокированная инструкция x86 имеет побочный эффект очистки буфера хранилища

и действительно, глядя на выходные данные инструментов dotnet на godbolt.org, я вижу что System.Threading.Thread.MemoryBarrier() компилируется (предположительно, обрабатывается) до следующего значения:

Код: Выделить всё

       lock
or       dword ptr [rsp], 0
ret
(sharplab.io дает эквивалентный результат для релизной сборки.)
Это кажется слегка удивительным... Intel предоставила mfence инструкция, которая кажется идеальной для этой цели, и более старый метод платформы dotnet Interlocked.SpeculationBarrier задокументирован для создания mfence под x86 и amd64 (как и старый Thread.VolatileRead и запись методы с тех пор они устарели). У меня нет подходящих инструментов для просмотра сгенерированной сборки MemoryBarrier() для других архитектур, но документация по модели памяти предполагает, что ARM64 получает инструкцию dmb, которая представляет собой полный барьер памяти и, следовательно, предположительно эквивалентна to mfence.
От BeeOnRope есть интересный ответ на вопрос: имеет ли lock xchg такое же поведение, как mfence? это говорит о том, что mfence при некоторых обстоятельствах предлагает более сильные гарантии, чем lock, и я не могу высказать свое мнение по этому поводу, но даже если бы эти две инструкции были абсолютно эквивалентны: при прочих равных условиях я бы выбрали mfence как более очевидный вариант. Вероятно, инженеры-компиляторы Microsoft знают лучше.
Тогда возникает вопрос: почему lock или вместо mfence?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -of-mfence
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему в C# Thread.MemoryBarrier() используется «lock or» вместо mfence?
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Почему выходные данные этой многопоточной программы различаются, если не используется Thread.Join или не удален Thread.S
    Anonymous » » в форуме C#
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Почему выходные данные этой многопоточной программы различаются, если не используется Thread.Join или не удален Thread.S
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Множественные вызовы Parallel.ForEach, MemoryBarrier?
    Гость » » в форуме C#
    0 Ответы
    84 Просмотры
    Последнее сообщение Гость
  • Какова цель объединения MemoryBarrier в .NET?
    Anonymous » » в форуме C#
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»