нём не обновляет значение volatile аргумента при неудаче?
https://godbolt.org/z/4YMTM5
А с чего должен? И не волатильного аргумента, что ли, обновляет?
В соответствии со смыслом квалификатора volatile. Если у меня действительно есть нужда в использовании последнего значения, а не кэшированного на момент инициализации операции, мне что, придется цикл в ручную писать?
Честно, не знаю, чего ты хочешь. И как ты собираешься "действительно" последнее значение получить с обычной, пусть волатильной переменной. Однако в данном случае поведение как и с обычными аргументом, и меняться ничего не должно.
а где тут пример собственно, а то не понятно в чем собственно вопрос
vaSum: addss %xmm1, %xmm0 я спрашиваю, почему на каждой попытке обновить значение атомика не делается movss (%rsi), %xmm1
Я не вижу асм, ибо с телефона, но я до сих пор не понял, почему ты ожидаешь, что магия сделается, когда она не должна
Я еще раз говорю - volatile. В асм коде я вижу lock-free алгоритм замены значения атомика. В случае крайнего невезения значение переменной in может поменяться бесконечно много раз
так чего вы хотите то от volatile?
Мне кажется, он хочет, чтобы во время атомарной операции значение могло измениться
Это не важно С точки зрения пользователя volatile переменная читается ровно один раз, поэтому компилятор корректный код сгенерил
Скорее не с точки зрения volatile, а с точки зрения операции https://godbolt.org/z/5K5fq5
С точки зрения пользователя
атомарные операции не мой конек вообще, но попробую ответить 1) чтение и запись через volatile это часть наблюдаемого поведения программы (intro#abstract-6.1) 2) наблюдаемое поведение должно быть одинаковым при каждом запуске программы (intro#abstract-5) 3) если использовать вашу семантику, то к наблюдаемому поведению программы относится в том числе некое неопределенное количество чтений volatile переменной, что идет вразрез с принципами абстрактного вычислителя как личное мнение я бы добавил, что когда речь заходит о volatile, от компилятора не ждешь, что он подложит такую свинью. все чтения и записи должны быть на виду, потому что это наверняка регистры какого-нибудь устройства
Я позже кидал код, где вместо volatile параметра используется атомарный параметр, который за время cas-loop'a потенциально также может быть изменён (другим потоком), так что мой вопрос был связан не с volatile, а с атомиком. Иными словами, я должен самостоятельно писать cas-loop дабы сказать, что поведение, которое я желаю наблюдать, является недетерминированным, но это неизменно при каждом запуске? Хотя я еще не разбираюсь в понятии абстрактной машины, мне кажется что здесь говорится, что исполнение должно совпадать с одним из возможных исполнений на абстрактной машине, а здесь вообще упоминается недетерминированность. Благодарю.
В данном случае вообще не может быть никаких вариантов, посмотри на сигнатуру fetch_add; загрузка из volatile переменной будет ровно один раз при вычислении аргумента
Благодарю, что открыли глаза. Там передача по значению, да уж... А составное присваивание эквивалентно.
Интересно, если бы там была ссылка, моё предположение было бы верным?..
1) раз не в volatile дело, то и нет большого смысла рассуждать на уровне абстрактной машины, потому что манипуляции с атомарными переменными не относятся к наблюдаемому поведению сами по себе (intro#abstract-6) 2) соответственно, intro#abstract-5 это не про ваш пример 3) недетерминированность это про unspecified поведение, как гласит intro#abstract-3 вообще, на cppcon'е в этом году хорошо раскрыли тему абстрактной машины
Обсуждают сегодня