Я знаю, что в .Net все 32-битные типы (например, int
, bool
и т.д.) являются потокобезопасными. То есть, не будет частичной записи (согласно спецификациям).
Но то же самое относится к int?
(nullable int)?
Я знаю, что в .Net все 32-битные типы (например, int
, bool
и т.д.) являются потокобезопасными. То есть, не будет частичной записи (согласно спецификациям).
Но то же самое относится к int?
(nullable int)?
Вопрос плохо сформулирован и, следовательно, путаница в ответах до сих пор. Вопрос должен быть "читается и записывается в переменную типа int, гарантированной быть атомарной?"
Нет, абсолютно нет. Спецификация предельно ясна в этом вопросе:
Считывание и запись следующих типов данных: atomic: bool, char, byte, sbyte, short, ushort, uint, int, float и reference. Кроме того, чтение и запись типов перечислений с базовым типом в предыдущем списке также являются атомарными. Считывание и запись других типов, включая длинные, улоновые, двойные и десятичные, а также пользовательские типы, не гарантируется атомарным.
Вполне возможно, что поток может прочитать частично записанное значение из переменной с общей памятью типа с возможностью NULL.
Например, предположим, что у вас есть int? переменной x, которая в настоящее время имеет значение null. Поэтому он содержит int, установленный в ноль, а bool - false. Теперь в другом потоке вы пишете значение null "int" на x. Совершенно легально, чтобы другой поток читал ненулевой int zero из x, потому что "true" в bool можно было установить до того, как 5 будет установлено в int.
Нет, поскольку int?
на самом деле является структурой (Nullable<int>
), состоящей из int
и a bool
.
От http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx:
Все публичные статические (Shared in Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.