Подтвердить что ты не робот

Есть int? поточный сейф?

Я знаю, что в .Net все 32-битные типы (например, int, bool и т.д.) являются потокобезопасными. То есть, не будет частичной записи (согласно спецификациям).

Но то же самое относится к int? (nullable int)?

4b9b3361

Ответ 1

Вопрос плохо сформулирован и, следовательно, путаница в ответах до сих пор. Вопрос должен быть "читается и записывается в переменную типа 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.

Ответ 2

Нет, поскольку int? на самом деле является структурой (Nullable<int>), состоящей из int и a bool.

Ответ 3

От http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx:

Все публичные статические (Shared in Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.