Часто бывает необходимо избавиться от лишней синхронизации потоков. В связи с этим возникает вопрос - какие операции атомарны, а какие нет? Как точно разделить все операции в программе на 2 множества?
Ответ
Спецификация C#:
5.5 Atomicity of variable references
Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type in the previous list are also atomic.
Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic. Aside from the library functions designed for that purpose, there is no guarantee of atomic read-modify-write, such as in the case of increment or decrement.
Т.е. атомарна запись и чтение в bool, char, byte, sbyte, short, ushort, uint, int, float, ссылочные типы + базирующися на этих типах перечисленя.
Все остальное - не атомарно, если в msdn по конкретному методу не сказано иначе.
На практике к атомарным методам стандартных классов CLR относятся только методы класса Interlocked - через него можно добиться атомарности инкремента / декремента / обмена значений.
Комментариев нет:
Отправить комментарий