Страницы

Поиск по вопросам

вторник, 5 февраля 2019 г.

Атомарность операции получения экземпляра класса на x64 приложении

Атомарность присваивания можно добиться с помощью System.Threading.Interlocked
Interlocked.Exchange(ref toItem, fromItem);
А вот как атомарно получить экземпляр класса атомарно, ведь у System.Threading.Interlocked нет метода Read(ref object), есть только Read(ref long)?
TObject obj = somethingObject; //Сомнение атомарности. //Поскольку передача указателя x64 не умещается в такт процессора, //и не гарантирует атомарности.
просьба не приводить примеры с lock, т.к. мне они не интересны.


Ответ

Операция чтения ссылки на объект всегда атомарная. Это следствие базового принципа .NET: если ваш код не содержит вызовов unsafe - вы никак не можете получить некорректную ссылку на объект.
Как следствие, всегда атомарными являются чтение int, указателей и IntPtr. Более того, чтение long тоже атомарно на 64-битной системе (найденный вами метод Interlocked.Read(ref long) предназначен для платформ x86 или AnyCPU)
Однако, надо понимать что Interlocked-операции - это не только атомарность, это еще и барьеры памяти. Поэтому читать разделяемую переменную как TObject obj = somethingObject нельзя - это чтение может дать устаревшие данные.
Для чтения нужно использовать метод Volatile.Read
TObject obj = Volatile.Read(ref somethingObject);

Комментариев нет:

Отправить комментарий