атомарные аргументы порядок выполнения в C - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь работать с функциями stdatomic.h, в частности с atomic_flag_test_and_set.Я не вижу никаких ошибок, но хочу знать, всегда ли то, что я делаю, безопасно.У меня есть такая структура:

typedef struct Mystruct {
    int somedata;
    atomic_flag flag;
} Mystruct;

Позже, когда я создаю mystruct и использую его экземпляр флага, я делаю это так:

if(atomic_flag_test_and_set(&mystructInstance->flag)) {
    // do something
}

Является ли оценка&mystructInstance->flag всегда завершается до проверки на атомарную операцию?Я бы предположил, так как это должна быть одна инструкция процессора (или что-то, что эмулирует одну инструкцию процессора), но я хочу убедиться.

1 Ответ

0 голосов
/ 18 декабря 2018

Всегда ли оценка &mystructInstance->flag всегда завершается до проверки атомарной операции?

Ответ на этот вопрос можно найти в разделе «Вызовы функций» вСтандарт Си.

6.5.2.2 Вызовы функций
...
4. Аргумент может быть выражением любого полного типа объекта. При подготовке к вызову функции аргументы оцениваются, и каждому параметру присваивается значение соответствующего аргумента.

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

10. Существует точка последовательности после вычислений указателя функции и фактических аргументов, но перед фактическим вызовом.Каждая оценка в вызывающей функции (включая вызовы других функций), которая иначе специально не упорядочена до или после выполнения тела вызываемой функции, определяется неопределенным образом по отношению к выполнению вызываемой функции.

...