Атомарность присваивания можно добиться с помощью 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);
Комментариев нет:
Отправить комментарий