Int?поток безопасно? - PullRequest
       19

Int?поток безопасно?

23 голосов
/ 15 июня 2010

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

Но применимо ли это к int? (nullable int)?

Ответы [ 3 ]

42 голосов
/ 16 июня 2010

Вопрос плохо сформулирован, и, следовательно, путаница в ответах до сих пор.Вопрос должен звучать так: «Чтение и запись в переменную типа int? Гарантированно будет atomic

Нет, абсолютно нет.Спецификация предельно ясна в этом отношении:

Чтения и записи следующих типов данных являются атомарными: bool, char, byte, sbyte, short, ushort, uint, int, float и ссылочные типы,Кроме того, чтение и запись перечислимых типов с базовым типом в предыдущем списке также являются атомарными.Чтение и запись других типов, включая long, ulong, double и decimal, а также определяемые пользователем типы, не гарантированно являются атомарными.

Поток может полностью прочитатьчастично записанное значение из переменной разделяемой памяти типа nullable.

Например, предположим, у вас есть int?переменная x, которая в настоящее время имеет значение null.Поэтому он содержит int, установленный в ноль, и bool, установленный в false.Теперь в другом потоке вы пишете обнуляемый int "5" в x.Совершенно законно, что другой поток считывает ненулевой int-ноль из x, потому что «true» в bool может быть установлено до того, как 5 будет установлено в int.

12 голосов
/ 15 июня 2010

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

3 голосов
/ 15 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...