вот такой псевдокод:
if atomic_pointer != invalid_marker
return atomic_pointer
pointer = do_stuff(...)
atomic_pointer = pointer
return pointer
Цель простая — закешировать результат операции. do_stuff внутри уже синхронизирован. Операция там весьма дорогая, поэтому spin вокруг неё делать смысла нет. Возвращается всегда одно и то же значение для заданных входных параметров.
Я правильно понимаю, что в этом случае мне достаточно relaxed store and load?
А вот на это кто-нибудь что-нибудь сможет ответить? 😂
Я согласен с твоим утверждением!)
Вообщые static переменная для таких целей хорошо подходит. Гарантируется, что никто не сможет к ней обратиться до того, как она инициализирована. А так нужны release и acuire, причем даже на x86. (барьеры компилятора никто не отменял).
auto atomic_pointer_snapshot = atomic_pointer.load(acquire); if atomic_pointer_snapshot != invalid_marker return atomic_pointer_snapshot pointer = do_stuff(...) atomic_pointer.store(pointer, seq_cst) return pointer
Обсуждают сегодня