Здравствуйте, vdimas, Вы писали:
V>>>Смогёшь?
V>·>Я ж уже тебе показывал, но чукча не читатель: https://godbolt.org/z/LLNDkD
V>Показать и доказать — разные вещи. ))
После очередной подмены тезис стал заключаться в том, что atomic<int>+relaxed и volatile sig_atomic_t — оба атомарны с т.з. многопоточности т.к. генерят одинаковый код. Я показал, что иногда генерится разный код. ЧТД.
Но ты снова подменяешь тезис какими-то конкретными имплементациями:
V>У тебя по ссылке swap, но чтение содержимого переменной не требовалось, там безусловная запись, поэтому, скорее всего, будет работать "can optimize away fetching the original value".
И что, что скорее всего? А иногда и нет. Типичный UB.
V>Итого, когда биты aq=0 и rl=0 у этих операций и чтение значения не требуется (см в твоём примере amoswap.w zero, ...), семантика происходящего не будет отличаться от простого sw.
Если implement AMOs at memory controllers. А если нет?
V>Вопрос: а почему же всё-таки AMO, а не sw?
V>Ответ там же в доке по AMO:
V>If the address is not naturally aligned, a misaligned address exception will be generated.
Ты хочешь сказать, что это единственная причина? Почему тогда сгенерился такой код? Ведь компилятор явно знает, что оно aligned.
В любом случае, даже если risc и все известные архитектуры будут атомик по самые гланды, это не меняет того факта, что по стандарту _языка_ ни int, ни даже volatile int не являются atomic.