Стандарт не гарантирует, что std::atomics
имеет тот же размер, что и базовый тип, и что операции на atomic
не имеют блокировки (хотя они, вероятно, будут по крайней мере для uint32
). Поэтому я почти уверен, что нет никакого подходящего способа объединить их в одну 64bit
атомарную операцию. Поэтому вам нужно решить, хотите ли вы вручную объединить две переменные в 64-битную (и работать только с 64-битными операциями) или нет.
В качестве примера, платформа может не поддерживать 64bit
CAS (для x86, который был добавлен с первым Pentium IIRC, поэтому он не будет доступен при компиляции 486. Совместимый. В этом случае он должен как-то блокироваться, поэтому атомарный может содержать как переменную 64bit
, так и блокировку. Из
Относительно ограждений: Это зависит от memory_order
, который вы указываете для своей операции. Если порядок памяти указывает, что две операции должны быть видимы в том порядке, в котором они выполняются, компилятор, очевидно, не сможет оптимизировать ограждение, иначе это может произойти. Конечно, при условии, что вы нацелены на x86, только memory_order_seq_cst
фактически выдаст инструкцию-барьер из того, что я помню, поэтому все, что меньше, будет препятствовать переупорядочению команд, выполняемому компилятором, но не будет иметь реального штрафа).
Конечно, в зависимости от вашей платформы вам может не понравиться обработка двух std::atomic<int32>
как одного из int64
, выполняющего приведение либо через union
, либо reinterpret_cast
, просто имейте в виду, что это поведение не требуется стандартом и может (по крайней мере теоретически) прекратить работу в любое время (новая версия компилятора, другие параметры оптимизации, ...)