Функция stdatomic.h для простого int - дает неопределенное или определяемое реализацией поведение? - PullRequest
2 голосов
/ 20 октября 2019

С 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)

1 Ответ

0 голосов
/ 06 ноября 2019

Не использовать _Атомные типы для атомарных функций - это определенно неопределенное поведение. Я немного удивлен, что компилятор не жалуется, но Си довольно простителен. Атомарные функции предоставляют очень конкретную гарантию того, как они ведут себя, когда несколько потоков изменяют одно и то же место в памяти одновременно. Ваш простой пример на самом деле не демонстрирует это.

Прочитайте описание атомарных типов :

Объекты атомарных типов являются единственными объектами, свободными от данныхрасы, то есть они могут быть изменены двумя потоками одновременно или изменены одним и прочитаны другим.

Если не использовать атомарные типы, вам больше не гарантируется возможность доступа к значениям атомарным способом, что делает атомную функцию бесполезной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...