Size: a a a

2020 June 22

ПК

Побитый Кирпич... in pro.cxx
magras
volatile от ms обещает rel/ac.
Я так понимаю rel/ac не даст happens before
источник

m

magras in pro.cxx
Побитый Кирпич
Я так понимаю rel/ac не даст happens before
Да, здесь вы правы.
источник

ПК

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

S

Serg in pro.cxx
ну надо учитывать аппаратные гарантии всегда
если считать что их вообще нет никаких, то невозможно писать производительные многопоточные программы
источник

S

Serg in pro.cxx
процессоры в целом дают гарантии атомарности load store кроме особых случаев
источник

S

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

m

magras in pro.cxx
Serg
ну надо учитывать аппаратные гарантии всегда
если считать что их вообще нет никаких, то невозможно писать производительные многопоточные программы
Но вы же видели, что инкремент volatile от ms был разбит на 3 операции. load inc store. Где гарантия что между load и store другой поток не изменит значение?
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
в стандарте решили это не описывать
только компилятор работает по стандарту и не увидев в нужном месте mutex.lock или atomic может посчитать, что тут однопоточный код и из этого сделать какие то выводы, которые приведут к неработающей программе. И на платформу ему будет пофиг
источник

S

Serg in pro.cxx
magras
Но вы же видели, что инкремент volatile от ms был разбит на 3 операции. load inc store. Где гарантия что между load и store другой поток не изменит значение?
там где не нужна атомарность инкремента там может она нарушиться
источник

S

Serg in pro.cxx
atomic_load()  и atomic_store() думаю на всех CPU без дополнителоьных инструкций реализваны
источник

S

Serg in pro.cxx
Побитый Кирпич
только компилятор работает по стандарту и не увидев в нужном месте mutex.lock или atomic может посчитать, что тут однопоточный код и из этого сделать какие то выводы, которые приведут к неработающей программе. И на платформу ему будет пофиг
volatile должен этому мешать
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
volatile должен этому мешать
только как случайность в некоторых случаях, в общем случае никаких гарантий нет
источник

S

Serg in pro.cxx
magras
Но вы же видели, что инкремент volatile от ms был разбит на 3 операции. load inc store. Где гарантия что между load и store другой поток не изменит значение?
даже если он не разбит а сделан одной инструкцией:   inc x - это не атомарная -  другой поток может вклиниться в середину ее выполнения
источник

m

magras in pro.cxx
Serg
там где не нужна атомарность инкремента там может она нарушиться
Но такое невозможно использовать в многопоточном приложении.
источник

S

Serg in pro.cxx
magras
Но такое невозможно использовать в многопоточном приложении.
не во всех многопоточных нужна атомарность. Где нужна - её явно указывают
источник

m

magras in pro.cxx
Serg
не во всех многопоточных нужна атомарность. Где нужна - её явно указывают
Хотелось бы увидеть любой пример.
источник

S

Serg in pro.cxx
magras
Хотелось бы увидеть любой пример.
кольцевой буфер
источник

m

magras in pro.cxx
Serg
кольцевой буфер
В кольцевом буфере не используется cas. Мы же говорим об инкременте, который был разбит на 3 инструкции.
источник

S

Serg in pro.cxx
я привел пример приложения где многопоточность но не нужны atomic- переменные
источник

m

magras in pro.cxx
Кроме того, без atomic переменных или happens-before (который может обеспечить, например, std::mutex) у вас получается UB.
источник