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