Atomic variable accessed twice in an expression

Переменная может быть изменена между доступами

Описание

Этот дефект происходит когда атомарные типы C или C++ std::atomic переменные класса появляются дважды в выражении и существует:

  • Две атомарных операции чтения на переменной.

  • Атомарное чтение и отличная атомарная операция записи на переменной.

Стандарт C задает определенные операции на атомарных переменных, которые ориентированы на многопотоковое исполнение и не вызывают условия состязания данных. В отличие от отдельных операций, пара операций на той же атомарной переменной в выражении не ориентирована на многопотоковое исполнение.

Риск

Поток может изменить атомарную переменную между парой атомарных операций, которые могут привести к состоянию состязания данных.

Фиксация

Не ссылайтесь на атомарную переменную дважды в том же выражении.

Примеры

развернуть все


#include <stdatomic.h>

atomic_int n = ATOMIC_VAR_INIT(0);

int compute_sum(void)
{
    return n * (n + 1) / 2;
}

В этом примере, глобальная переменная n ссылается дважды в операторе возврата compute_sum(). Значение n может измениться между двумя отличными операциями чтения. compute_sum() может возвратить неправильное значение.

Коррекция — передает переменную как аргумент функции

Одна возможная коррекция должна передать переменную как аргумент функции n. Переменная копируется в память, и операции чтения на копии гарантируют тот compute_sum() возвращает правильный результат. Если вы передаете переменную типа int вместо типа atomic_int, коррекция все еще допустима.


#include <stdatomic.h>

int compute_sum(atomic_int n)
{
    return n * (n + 1) / 2;
}

Информация о результате

Группа: параллелизм
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: ATOMIC_VAR_ACCESS_TWICE
Удар: носитель
Введенный в R2018b