Страницы

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

понедельник, 6 января 2020 г.

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

#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);

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

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