Является ли инициализация объекта модификацией ячейки памяти при рассмотрении конфликтных действий?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Является ли инициализация объекта модификацией ячейки памяти при рассмотрении конфликтных действий?

Сообщение Anonymous »

Код: Выделить всё

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
intro.races p21 говорит:

Два действия потенциально параллельны, если
< blockquote>

[*]они выполняются разными потоками, или
[*][...]


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

intro.races p2 определяет, какие два конфликтных действия являются

Два вычисления выражения конфликтуют, если одно из них изменяет место в памяти ([intro.memory]), а другое считывает или изменяет одно и то же место в памяти.

Во-первых, оценки в #1 и #2 не происходят раньше других, а #1 не является атомарным, #2 — это чтение A::a в памяти, на которую указывает ptr. Однако являются ли они конфликтными действиями? Непонятно.
Я не нашел в стандарте формулировки, в которой говорилось бы, что инициализация объекта считается модификацией ячейки памяти. Как интерпретировать этот пример с точки зрения стандарта C++?

Подробнее здесь: https://stackoverflow.com/questions/787 ... -when-cons
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»