С GCC что-то вроде этого компилируется и, вероятно, работает как ожидалось:
#include <stdatomic.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
(void)argc;
int x = 23;
// XXX
// instead of:
// _Atomic int x = 23;
int exp = atoi(argv[1]);
int y = atoi(argv[2]);
printf("x = %d, exp = %d, y = %d\n", x, exp, y);
bool b = atomic_compare_exchange_strong(&x, &exp, y);
printf("x = %d, exp = %d, y = %d => %s\n", x, exp, y, b ? "true" : "false");
return 0;
}
Ссылка C говорит о таких элементарных функциях :
Этоуниверсальная функция, определенная для всех атомарных типов объектов A. Аргумент является указателем на энергозависимый атомарный тип для приема адресов как энергонезависимых, так и энергозависимых (например, отображаемых в памяти входов / выходов) атомарных переменных. C является неатомарным типом, соответствующим A.
Это означает, что атомарные функции, такие как atomic_compare_exchange_strong()
, не определены для неатомарных типов.
Поскольку int
являетсянеатомарный тип приводит ли приведенный выше код к неопределенному поведению?
Или стандарт C определяет это как поведение, определяемое реализацией?
(где реализация может определять int
как атомарное поведениетип, так что в основном это эквивалентно _Atomic int
)