Код: Выделить всё
struct A{int a; A():a(1){}}
std::atomic x;
// thread 1:
A* ptr = new A(); // #1
x.store(ptr,memory_order::relaxed);
//thread 2:
auto ptr = x.load(memory_order::relaxed);
int b = ptr->a; // #2
Два действия потенциально параллельны, если
< blockquote>
[*]они выполняются разными потоками, или
[*][...]
Выполнение программы содержит гонку данных, если она содержит два потенциально одновременных конфликтующих действия, хотя бы одно из которых не является атомарным. , и ни одно из них не происходит раньше другого,
intro.races p2 определяет, какие два конфликтных действия являются
Два вычисления выражения конфликтуют, если одно из них изменяет место в памяти ([intro.memory]), а другое считывает или изменяет одно и то же место в памяти.
Во-первых, оценки в #1 и #2 не происходят раньше других, а #1 не является атомарным, #2 — это чтение A::a в памяти, на которую указывает ptr. Однако являются ли они конфликтными действиями? Непонятно.
Я не нашел в стандарте формулировки, в которой говорилось бы, что инициализация объекта считается модификацией ячейки памяти. Как интерпретировать этот пример с точки зрения стандарта C++?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -when-cons