Находятся примитивные типы данных в c#, атомарном (ориентированы на многопотоковое исполнение)?

Например, сделайте я должен заблокировать a bool оценить когда многопоточность?

9
задан user151019 13 February 2012 в 17:23
поделиться

4 ответа

Не существует такого понятия, как атомный тип. Только операции могут быть атомарными.

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

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

17
ответ дан 4 December 2019 в 09:36
поделиться

Аналогичный вопрос здесь

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

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

Это подтверждает, что s_Initialized никогда не будет нестабильным, и что чтение и запись в примитивные типы являются атомарными.

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

Джон.

По сути, у вас не будет проблем с "падением" из-за того, что вы не заблокируете bool. Что у вас может быть, так это состояние гонки, для которого bool обновляется или читается. Если вы хотите убедиться, что bool записывается / читается в определенном порядке, вам следует использовать какой-то механизм блокировки.

2
ответ дан 4 December 2019 в 09:36
поделиться

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

Это причина таких классов, как "Interlocked".

3
ответ дан 4 December 2019 в 09:36
поделиться

Статические примитивные типы потокобезопасны, поэтому вам не нужно блокировать переменные этих типов. Однако, любая переменная экземпляра примитивного типа не гарантирована. См. здесь: Are primitive types like bool threadsafe ?

MSDN PrimitiveType Class

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

0
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

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