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

Какие операции являются атомарными в С#?

Есть ли систематический способ узнать, будет ли операция в С# атомарной или нет? Или существуют общие руководящие принципы или эмпирические правила?

4b9b3361

Ответ 1

Для чего-то более полного/подробного:

Чтение и запись в 32-битные типы значений являются атомарными: это включает в себя следующие типы встроенных значений (struct): bool, char, byte, sbyte, short ushort, uint, float. следующие типы (среди прочих) не гарантируются как атомарные: десятичные, двойные, длинные, улоновые.

например.

int x;
x = 10; // atomic
decimal d;

d = 10m; // not atomic

Назначение ссылок также является атомной операцией:

private String _text;
public void Method(String text)
{
  _text = text; // atomic
}

Ответ 2

Да. Прочтите спецификацию CLI: http://www.ecma-international.org/publications/standards/Ecma-335.htm. Например:

I.12.6.6 Атомные чтения и записи

Соответствующий CLI должен гарантировать, что доступ для чтения и записи правильно выровненные ячейки памяти не превышают размер родного слова (размер типа int int) является атомарным (см. п. 1.1.6.2), когда все записи доступа к местоположению имеют одинаковый размер. Атомные записи должны не изменяйте никакие биты, кроме написанных. Если явный макет (см. раздел II ( "Управление макетом экземпляра" )) используется для изменить поведение по умолчанию, элементы данных не превышают естественные размер слова (размер встроенного int) должен быть правильно выровнен. Ссылки на объекты должны обрабатываться так, как если бы они хранились в родной размер слова.

[Примечание: нет гарантии об атомном обновлении (чтение-изменение-запись) памяти, за исключением методов, предусмотренных для этого как часть библиотеки классов (см. раздел IV). Атомный написать "маленький элемент данных" (элемент не больше, чем родное слово размер) требуется, чтобы выполнить атомарное чтение/изменение/запись на аппаратном обеспечении, которое не поддерживает прямую запись в небольшие элементы данных. end note]

[Примечание: Нет гарантированного атомарного доступа к 8-байтным данным, когда размер native int - 32 бита, хотя некоторые реализации могут выполнять атомных операций, когда данные выровнены по 8-байтовой границе. конец примечание]

Что касается 64-битного вопроса, на это отвечает Эрик Липперт: http://blogs.msdn.com/b/ericlippert/archive/2011/05/31/atomicity-volatility-and-immutability-are-different-part-two.aspx

Спецификация CLI действительно обеспечивает более надежные гарантии. CLI гарантирует, что читает и записывает переменные типов значений, которые размер (или меньше) размера естественного указателя процессора неделимый; если вы используете код С# в 64-разрядной операционной системе в 64-разрядная версия CLR затем считывает и записывает 64-битные удвоения и длинные целые числа также гарантированно являются атомарными. Язык С# не гарантирует это, но спецификация времени выполнения. (Если вы используете С# кода в некоторой среде, которая не Внедрение CLI, конечно, вы не можете полагаться на это гарантия; свяжитесь с продавцом, который продал вам время выполнения, если вы хотите знать, какие гарантии они предоставляют.)

Еще один тонкий вопрос об атомарном доступе заключается в том, что основные процессор только гарантирует атомарность при считывании переменной или написанное связано с хранилищем, которое выровнено справа местоположение в памяти. В конечном итоге переменная будет реализована как указатель на память где-то. В 32-разрядной операционной системе это указатель должен быть равномерно делимым на 4 для чтения или записи гарантированно быть атомарным, а в 64-битной операционной системе быть равномерно делимым на 8.

Ответ 3

В спецификациях CLI вы можете получить здесь:

"Соответствующий CLI должен гарантировать, что доступ для чтения и записи правильно выровненные ячейки памяти не превышают размер родного слова (размер типа int int) является атомарным..."

Раздел 12.5 из спецификации С# здесь:

"Считывание и запись следующих типов данных должна быть атомарной: bool, char, byte, sbyte, short, ushort, uint, int, float и reference типы." Также: "... нет гарантии атомарного чтения-модификации-записи, например, в случае приращения или уменьшения."

Сделайте операцию инкремента атомарной с этим.