Как последовательно согласованный порядок в С++ определяет общий порядок?C++

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

Сообщение Anonymous »

Я читаю следующий пример с https://en.cppreference.com/w/cpp/atomi ... t_ordering. И мне трудно понять
  • в какой ситуации Assert(z.load() != 0); потерпит неудачу.
    почему использование Memory_order_seq_cst вместо Memory_order_ack_rel приводит к тому, что z никогда не становится равным 0.

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

#include 
#include 
#include 

std::atomic x = {false};
std::atomic y = {false};
std::atomic z = {0};

void write_x()
{
x.store(true, std::memory_order_seq_cst);
}

void write_y()
{
y.store(true, std::memory_order_seq_cst);
}

void read_x_then_y()
{
while (!x.load(std::memory_order_seq_cst))
;
if (y.load(std::memory_order_seq_cst)) {
++z;
}
}

void read_y_then_x()
{
while (!y.load(std::memory_order_seq_cst))
;
if (x.load(std::memory_order_seq_cst)) {
++z;
}
}

int main()
{
std::thread a(write_x);
std::thread b(write_y);
std::thread c(read_x_then_y);
std::thread d(read_y_then_x);
a.join(); b.join(); c.join(); d.join();
assert(z.load() != 0);  // will never happen
}
Насколько я понял, для read_x_then_y или read_y_then_x они могли наблюдать состояние среди: В первых двух случаях z = 1 (в конечном итоге 2), в третьем В случае z = 2, а в последнем случае read_x_then_y и read_y_then_x ждут, пока одно из `x' и 'y' не станет истинным. Однако согласно cppreference

Этот пример демонстрирует ситуацию, когда необходимо последовательное упорядочение. Любой другой порядок может вызвать утверждение, поскольку потоки c и d смогут наблюдать изменения атомов x и y в противоположном порядке.

Я не понимаю, как это возможно. Как изменения x и y будут происходить в противоположном порядке?
Кроме того, мне интересно, как использование Memory_order_seq_cst решит проблему. Это заставляет x.load в read_x_then_y выполняться до y.load?

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как создать согласованный PasetoSymmetricKey с пакетом nuget adavidesmet/paseto-dotnet?
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Согласованный часовой пояс для сравнения дат
    Anonymous » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Согласованный часовой пояс для сравнения дат
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Согласованный часовой пояс для сравнения дат
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Не удалось получить согласованный макет с попутным ветром для соответствующего контейнера
    Anonymous » » в форуме CSS
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

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