Lite_stream
@Lite_stream

Std::memory_order_relaxed vs регулярная переменная?

Правильно ли я понимаю, что memory_order_relaxed в контексте аннотаций по реордерингу (А не наличия методов интерфейса типа featch_add'ов и cas'ов. Также подразумевается что машина 64 битная, то есть запись/чтение в 8 байтовые переменные атомарные) для компилятора и процессора. С точки зрения использования неотличима от обычный переменной ?

То есть:
std::atomic<size_t> a; 
a.store(1, std::memory_order_relaxed);  
size_t b = a.load(std::memory_order_relaxed);


То же что и:
size_t a;
a = 1;
size_t b = a;


Если нет, то хотелось бы пример многопоточного кода, где std::memory_order_relaxed даёт какюу-либо полезную нагрузку для рабочего кода, в отличие от обычной переменной.

P.S.: Насколько я понимаю, ограничение, навязанное modification order'ом для std::memory_order_relaxed, запрещает кэшировать значение a.load(std::memory_order_relaxed) в регистр
Тут написано:
The modification order for an object is the order a thread would see if it was spinning in a tight loop running while(1) { y.load(relaxed); }, and happened to see every every change. (Not that that's a useful way to actually observe it, but every object has its own modification order that all threads can always agree on, like on real CPUs thanks to MESI exclusive ownership being required to commit a store to L1d cache. Or see it early via private store-forwarding between SMT threads on POWER CPUs.)
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы