2010-06-15 2 views
21

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

Но, что же относится к int? (nullable int)?

ответ

38

Вопрос плохо сформулирован и, следовательно, путаница в ответах до сих пор. Вопрос должен быть «читается и записывается в переменную типа int?», Которая должна быть атома? »

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

Чтение и запись следующих типов данных являются атомарными: BOOL, голец, байт, SByte, короткие, UShort, UINT, INT, поплавок, и ссылочные типы. Кроме того, чтение и запись типов перечислений с базовым типом в предыдущем списке также являются атомарными. Чтения и записи других типов, включая длинные, улоновые, двойные и десятичные, а также определяемые пользователем типы, не гарантируются как атомарные.

Вполне возможно, что поток может читать частично записанное значение из переменной с общей памятью типа NULL.

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

+0

Я понимаю ваш пример для int? .. но почему чтение/запись длинное, двойное и десятичное не атомное? – MalcomTucker

+0

@MalcomTucker: 32-битный процессор гарантирует, что операции с переменными являются атомарными, если они 32 бита. Длинным, двойным и десятичным может потребоваться более одной операции для записи или чтения всего значения, так как они больше 32 бит. –

+0

@MalcolmTucker: http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx предлагает функциональность, обеспечивающую возможность выполнения атомных операций в двойных и других типах. – Brian

12

Нет, так как int? фактически структура (Nullable<int>) состоит из int и bool.

+2

@ Эрик: Но, за исключением операторов преобразования, в 'Nullable ' нет открытых статических элементов '. – LukeH

+0

@ LukeH: что это касается вопроса? –

+1

@ Эрик: Мой комментарий был в ответ на более ранний комментарий (после удаления), сделанный другим Эриком, утверждая, что некоторые члены типа 'int?' - публичные статические члены - были потокобезопасными. – LukeH

3

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

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

+5

Проблема в том, что 'Nullable ' не имеет публичных статических членов (если вы не считаете операторы преобразования в/из 'T'). Это только текст шаблона, который вы найдете в документации для большинства объектов в MSDN. – LukeH

+3

Является ли факт, что это общая копия документации, делает ее менее точной? –

+1

..Посмотрите в порядке :) – Rusty

Смежные вопросы