Порядок памяти с несколькими хранилищамиC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Порядок памяти с несколькими хранилищами

Сообщение Гость »


Рассмотрим пример ниже. Предположим, что is initialized to 0.
There is one producer thread and two consumer threads that constantly check . If the barrier is set, they decrease . The producer thread waits for to reach 0. I am confused about the order of multiple store operations inside the producer.
If the order is like it is written, I think the code would run as expected. But if the store is reordered before store, it seems the assert check would fail.
Am I missing anything? Is there a way to fix this?

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

extern atomic barrier[2];
atomic_int runcnt{0};

void producer() {
runcnt.store(2, memory_order_relaxed);
barrier[0].store(1, memory_order_relaxed);
barrier[1].store(1, memory_order_relaxed);

while (runcnt.load(memory_order_relaxed)) {
cpu_pause();
}
}

void consumer(unsigned index) {
while (true) {
if (barrier[index].exchange(false, memory_order_relaxed)) {
int prev = runcnt.fetch_sub(1, memory_order_relaxed);
assert(prev > 0);
}
}
}


Источник: https://stackoverflow.com/questions/781 ... ple-stores
Ответить

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

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

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

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

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