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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки : ATOMIC_VAR_ACCESS_TWICE
Влияние: Средний
Введенный в R2018b