Я просмотрел Метод Interlocked.Or в .NET 5. Он отлично подходит для двух целых значений. Есть ли способ выполнить эквивалент этого для двух отдельных значений байта?
Я просмотрел документацию и вижу, что InterlockedOr8 существует в winnt.h
, но его P/вызов не даст хороших характеристик производительности.
Я попытался вызвать Interlocked.CompareExchange<T>
следующим образом, просто чтобы посмотреть, могу ли я просто вызвать его вообще с некоторыми значениями байтов:
var map = new byte[268435456];
Interlocked.CompareExchange(ref map[0], (byte)137, (byte)137);
Но я получаю следующую ошибку:
Ошибка CS0452. Тип «byte» должен быть ссылочным типом, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «Interlocked.CompareExchange (ref T, T, T)».
Interlocked.CompareExchange
в основном компилируется в инструкцию ЦП. Обычно это называется операцией CAS (сравнить и поменять местами), не знаю, почему С# назвал это по-другому. Он очень долго управлялся аппаратным обеспечением, еще до x86. - person Zer0   schedule 01.02.2021Interlocked.CompareExchange
дляbyte
? Нет. Нет, если вы ожидаете, что он будет вести себя как другие (инструкция процессора). Не могли бы вы реализовать другие допустимые вызовы CAS, чтобы сделать присваиваниеbyte
атомарным? Конечно. Этот ответ может помочь. Не используйте небезопасные приведения и здесь. Попытка выполнить небезопасный CAS с байтом может уничтожить остальную часть слова (в настоящее время 32-битного или 64-битного) в памяти. - person Zer0   schedule 01.02.2021CompareExchange
, не так ли? - person Alexandru   schedule 01.02.2021InterlockedOr8
непосредственно из С#, рассмотрите возможность переписать полный алгоритм на С++, а затем вызывать его только один раз из С#. Тогда вы платите только за стоимость одного thunk. Статья. - person John Wu   schedule 01.02.2021CMPXCHG
и подобные являются общими. С# здесь мало что может сделать, так как на самом деле он просто предоставляет вам аппаратные возможности. И это соответствует одной инструкции. - person Zer0   schedule 01.02.2021Monitor
и других примитивов синхронизации по какой-то причине. - person Zer0   schedule 01.02.2021