Я знаю, что в .Net все 32-битные типы (например, int
, bool
и т. Д.) Являются потокобезопасными. То есть, не будет частичной записи (согласно спецификациям).Is int? поточный сейф?
Но, что же относится к int?
(nullable int)?
Я знаю, что в .Net все 32-битные типы (например, int
, bool
и т. Д.) Являются потокобезопасными. То есть, не будет частичной записи (согласно спецификациям).Is int? поточный сейф?
Но, что же относится к int?
(nullable int)?
Вопрос плохо сформулирован и, следовательно, путаница в ответах до сих пор. Вопрос должен быть «читается и записывается в переменную типа int?», Которая должна быть атома? »
Нет, абсолютно нет. Спецификации предельно ясно по этому вопросу:
Чтение и запись следующих типов данных являются атомарными: BOOL, голец, байт, SByte, короткие, UShort, UINT, INT, поплавок, и ссылочные типы. Кроме того, чтение и запись типов перечислений с базовым типом в предыдущем списке также являются атомарными. Чтения и записи других типов, включая длинные, улоновые, двойные и десятичные, а также определяемые пользователем типы, не гарантируются как атомарные.
Вполне возможно, что поток может читать частично записанное значение из переменной с общей памятью типа NULL.
Например, предположим, что у вас есть int? переменной x, которая в настоящее время имеет значение null. Поэтому он содержит int, установленный в ноль, а bool - false. Теперь в другом потоке вы пишете значение null «int» на x. Совершенно легально, чтобы другой поток читал ненулевой int zero из x, потому что «true» в bool можно было установить до того, как 5 будет установлено в int.
Нет, так как int?
фактически структура (Nullable<int>
) состоит из int
и bool
.
@ Эрик: Но, за исключением операторов преобразования, в 'Nullable
@ LukeH: что это касается вопроса? –
@ Эрик: Мой комментарий был в ответ на более ранний комментарий (после удаления), сделанный другим Эриком, утверждая, что некоторые члены типа 'int?' - публичные статические члены - были потокобезопасными. – LukeH
От http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx:
Любые открытые (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые экземпляров не могут быть потокобезопасными.
Проблема в том, что 'Nullable
Является ли факт, что это общая копия документации, делает ее менее точной? –
..Посмотрите в порядке :) – Rusty
Я понимаю ваш пример для int? .. но почему чтение/запись длинное, двойное и десятичное не атомное? – MalcomTucker
@MalcomTucker: 32-битный процессор гарантирует, что операции с переменными являются атомарными, если они 32 бита. Длинным, двойным и десятичным может потребоваться более одной операции для записи или чтения всего значения, так как они больше 32 бит. –
@MalcolmTucker: http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx предлагает функциональность, обеспечивающую возможность выполнения атомных операций в двойных и других типах. – Brian