Size: a a a

2020 June 22

AS

Anatoly Shirokov in pro.cxx
Побитый Кирпич
Ты можешь объяснить конкретно почему на msdn сказано что volatile в msvc даёт aquire/release семантику, а по коду разницы никакой не видно?
нет
источник

S

Serg in pro.cxx
все обращения к памяти и без volatile на x86 дают acquire/release семантику
просто без volatile компилятор может заоптимизировать переменную в регистр и не обращаться снова в память
источник

S

Serg in pro.cxx
на других платформах это не так
источник

z

zeroid in pro.cxx
Побитый Кирпич
Ты можешь объяснить конкретно почему на msdn сказано что volatile в msvc даёт aquire/release семантику, а по коду разницы никакой не видно?
источник

m

magras in pro.cxx
Serg
все обращения к памяти и без volatile на x86 дают acquire/release семантику
просто без volatile компилятор может заоптимизировать переменную в регистр и не обращаться снова в память
Тем не менее это не отвечает на вопрос, почему с relaxed memory order (который слабее rel/ac) используется cas инструкция, а для volatile на котором ms обещает rel/ac используются три отдельные инструкции load inc store.
источник

S

Serg in pro.cxx
CAS нужна для atomic операций а не для rel/ac
источник

m

magras in pro.cxx
Serg
CAS нужна для atomic операций а не для rel/ac
Но для не atomic операций rel/ac же вообще не имеет смысла.
источник

S

Serg in pro.cxx
для атомик нужны более сильные гарантии чем rel/ac
источник

S

Serg in pro.cxx
которые сильнее снижают производительность
источник

S

Serg in pro.cxx
есть пример: кольцевой буфер, один thread пишет  и меняет только указатель конца очереди, а другой thread читает и меняет указатель начала очереди - тут не нужны atomic переменные, но нужны volatile переменные
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
есть пример: кольцевой буфер, один thread пишет  и меняет только указатель конца очереди, а другой thread читает и меняет указатель начала очереди - тут не нужны atomic переменные, но нужны volatile переменные
Но на x86 в этом плане volatile ничего дополнительного не даст?
источник

VS

Vlad Serebrennikov in pro.cxx
Serg
есть пример: кольцевой буфер, один thread пишет  и меняет только указатель конца очереди, а другой thread читает и меняет указатель начала очереди - тут не нужны atomic переменные, но нужны volatile переменные
volatile тут ни при чем
источник

S

Serg in pro.cxx
даст - отключит оптимизацию в регистры
источник

m

magras in pro.cxx
Serg
для атомик нужны более сильные гарантии чем rel/ac
Если обращение к памяти не атомарное, какое значение имеет memory oreder?
источник

S

Serg in pro.cxx
magras
Если обращение к памяти не атомарное, какое значение имеет memory oreder?
в слабых memory - моделях поток A может увидеть изменения переменной потоком B  в другой последовательности чем они были сделаны
источник

S

Serg in pro.cxx
как следствие: читающий поток может увидеть что элемент добавили , начать его читать, но не увидеть его в памяти
источник

m

magras in pro.cxx
Serg
в слабых memory - моделях поток A может увидеть изменения переменной потоком B  в другой последовательности чем они были сделаны
Но при этом все операции атомарны. Если операция не атомарна, будет плохо если запись будет паралелльна с чтением или записью. Так?
источник

S

Serg in pro.cxx
magras
Но при этом все операции атомарны. Если операция не атомарна, будет плохо если запись будет паралелльна с чтением или записью. Так?
это будет работать на x86  без использования атомарных операций (LOCK)
источник

m

magras in pro.cxx
Serg
для атомик нужны более сильные гарантии чем rel/ac
Отлично. Тогда можно еще раз пояснить эту фразу?
источник

S

Serg in pro.cxx
Можно так: atomic - это когда 2 потока меняют общую переменную
источник