Size: a a a

2020 June 22

S

Serg in pro.cxx
а когда переменных несколько - но каждую меняет свой thread, в определенном порядке - то важна memory model
источник

m

magras in pro.cxx
magras
Теперь я совершенно не понимаю что происходит.

Вот цитата из описания ключа:

> /volatile:ms
> Selects Microsoft extended volatile semantics, which add memory ordering guarantees beyond the ISO-standard C++ language. Acquire/release semantics are guaranteed on volatile accesses.

Где здесь acquire/release семантика?
https://godbolt.org/z/izGsPr
Отлично. Вот у меня есть код. В одном случае я использую volatile, который под msvc обещает rel/ac, во втором std::atomic с memory order relaxed. Почему на relaxed я получаю cas, а на rel/ac ничего?
источник

S

Serg in pro.cxx
std::atomic это класс который реализуется через функции
источник

S

Serg in pro.cxx
тут CAS операция заложена в реализацию тех функций
источник

m

magras in pro.cxx
Она тут избыточна и msvc генерирует неоптимальный код?
источник

S

Serg in pro.cxx
на x86 для реализации atomic нужен CAS или lOCK-префикс
источник

S

Serg in pro.cxx
но это очень затратная операция и не всегда нужна, когда достаточно volatile
источник

m

magras in pro.cxx
Serg
на x86 для реализации atomic нужен CAS или lOCK-префикс
Я тоже так считаю. Но почему ее нет на volatile? Он же должен обеспечивать более строгий memory order?
источник

S

Serg in pro.cxx
не должен
источник

S

Serg in pro.cxx
строгий memory order обеспечивается на x86 аппаратно
источник

S

Serg in pro.cxx
повторюсь: если попробуете реализовать кольцевой буфер на  атомиках и на volatile
то на атомиках будет работать медленнее,
но обе реализваци будут корректны
без volatile  и с отключенной оптимизацией корректно будет работать только на x86
источник

m

magras in pro.cxx
Serg
повторюсь: если попробуете реализовать кольцевой буфер на  атомиках и на volatile
то на атомиках будет работать медленнее,
но обе реализваци будут корректны
без volatile  и с отключенной оптимизацией корректно будет работать только на x86
Без макрософтовского volatile даже volatile не спасает от UB. Но сейчас не об этом.
источник

S

Serg in pro.cxx
может быть. Я говорю в контесте msvc для разных платформ
источник

m

magras in pro.cxx
У меня есть предположение что вы пытаетесь сказать, что store и load на volatile от ms атомарны, но поддерживают не все операции. В частности инкремент у них сломан. Но это же одна из базовых обераций для атомика.
источник

S

Serg in pro.cxx
store и load не всегда атомарны на x86 даже, в случае невыровненности могут быть неатомарны
источник

S

Serg in pro.cxx
атомарный инкремент есть на x86:    lock inc x
источник

S

Serg in pro.cxx
я хочу сказать что store и load поддерживают строгую memory model,  
для атомарности этого не достаточно
источник

m

magras in pro.cxx
Но как можно говорить о memory order без атомарности? Если доступ не атомарный чтение/запись переменной в которую пишет кто-то еще - это уже ошибка.
источник

S

Serg in pro.cxx
memory order не обязательно про одновременную запись в общую переменную
источник

S

Serg in pro.cxx
memory order важен когда нет таких одновременных записей
источник