Являются ли примитивные типы данных в C# Atomic (безопасно поток)?

StackOverflow https://stackoverflow.com/questions/2433772

Вопрос

Например, мне нужно заблокировать bool Значение при многопользовании?

Это было полезно?

Решение

Нет такой вещи, как атомный тип. Анкет Только операции может быть атомным.

Чтение и написание типа данных, который вписывается в одно слово (int на 32-битном процессоре, long На 64-битном процессоре) технически «атомный», но джиттер и/или процессор могут решить переупорядочить инструкции и, таким образом, создать неожиданные условия гонки, поэтому вам либо нужно сериализовать доступ с lock, использовать Interlocked класс для записей (и в некоторых случаях читает) или объявить переменную volatile.

Короткий ответ: если два разных потока могут получить доступ к одному полю/переменной, и, по крайней мере, один из них будет писать, вам нужно использовать какую -то блокировку. Для примитивных типов это обычно Interlocked учебный класс.

Другие советы

Подобный вопрос здесь

Для окончательного ответа перейти к спецификации. :)

Раздел I, раздел 12.6.6 Спецификации CLI: «Соответствующий CLI гарантирует, что чтение и запись доступа к правильно выровненным местам памяти не больше, чем нативный размер слова атомны, когда все доступные доступа к месту имеют одинаковый размер. . "

Таким образом, это подтверждает, что s_initialized никогда не будет нестабильным, и это чтение и записи типам примирации является атомным.

Interlocking создает барьер памяти, чтобы не допустить переупорядочения чтения и записи процессора. Замок создает единственный необходимый барьер в этом примере.

Джон.

По сути, у вас не будет проблемы с «сбоем», не зафиксировав Bool. То, что у вас может быть, является условием гонки для порядок, о котором Bool обновляется или читается. Если вы хотите Garuntee, что Bool записана/прочитал в определенном порядке, то вы хотите использовать какой -то механизм блокировки.

Вроде, как бы, что-то вроде. В этом есть отличная тема здесь, но короткая версия, в то время как данное чтение или запись может быть атомным, это почти никогда не то, что вы делаете. Например, если вы хотите увеличить целое число, вам нужно 1) прочитать значение, 2) добавить его в значение и 3) сохранить значение обратно. Любая из этих операций может быть прерван.

Это причина для таких классов, как «Бережок».

Статические примитивные типы являются Threadsafe, поэтому вам не нужно блокировать эти напечатанные переменные. Однако любая переменная экземпляра примитивного типа не гарантированно. Глянь сюда: Примитивные типы, такие как Bool Threadsafe?

MSDN PrimitiveType Class

И вот еще одна полезная ссылка, которая также может представлять интерес, которую я нахожу решением очень убедительным: так что вопрос: Как я узнаю, безопасен ли метод C#?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top