У меня есть переменная, которую я использую для представления состояния. Его можно читать и записывать из нескольких потоков.
Я использую Interlocked.Exchange
и Interlocked.CompareExchange
, чтобы изменить его. Однако я читаю его из нескольких потоков.
Я знаю, что volatile
можно использовать, чтобы убедиться, что переменная не кэшируется локально, но всегда читается непосредственно из памяти.
Однако, если я устанавливаю переменную в volatile, тогда она генерирует предупреждение об использовании volatile и передаче с использованием ref в Interlocked.
Я хочу, чтобы каждый поток читал последнее значение переменной, а не какую-то кешированную версию, но я не могу использовать volatile.
Существует Interlocked.Read
, но он предназначен для 64-битных типов и недоступен в компактной структуре. В документации для него говорится, что он не нужен для 32-битных типов, поскольку они уже выполняются за одну операцию.
В Интернете есть заявления, которые вам не нужны волатильность, если вы используете методы блокировки для всего вашего доступа. Однако вы не можете прочитать 32-битную переменную, используя методы Interlocked, поэтому вы не можете использовать Interlocked методы для всего вашего доступа.
Есть ли способ выполнить безопасное чтение и запись моей переменной без использования блокировки?