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

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

Сообщение Anonymous »

Я запускаю свой код C ++ на Mac Machine Arm. Эти переменные изначально 0 , а затем обновляются до 1 .
Теперь есть несколько потоков считывателей. Каждый поток считывает значение x и y . Идея состоит в том, что если есть < /p>

"один глобальный заказ" < /p>
< /blockquote>
Тогда {x = 0, y = 1} и {x = 1, y = 0} не видно вместе. std :: atomic готово . Готовый флаг похож на спусковой крючок. Все потоки могут запустить свою соответствующую логику только после того, как готова - true
Но удивительно, я получаю результат {0,1} и {1,0} на моей машине.

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

#include 
#include 
#include 
#include 

static constexpr std::size_t ITERATIONS = 1000000;
static constexpr std::size_t NUM_THREADS = 10;
using result = std::pair;
std::vector results;
std::atomic_bool ready;
std::atomic x, y;

void initialize()
{
results.clear();
results.resize(NUM_THREADS, {0, 0});

ready.store(false, std::memory_order_seq_cst);
x.store(0, std::memory_order_seq_cst);
y.store(0, std::memory_order_seq_cst);
}

void modify_x()
{
while (!ready.load(std::memory_order_seq_cst))
;
x.store(1, std::memory_order_seq_cst);
}

void modify_y()
{
while (!ready.load(std::memory_order_seq_cst))
;
y.store(1, std::memory_order_seq_cst);
}

void check(int i)
{
while (!ready.load(std::memory_order_seq_cst))
;

int xl = x.load(std::memory_order_seq_cst);
int yl = y.load(std::memory_order_seq_cst);

results[i] = {xl, yl};
}

bool check_results()
{
// stores count of {0, 0}, {0, 1}, {1, 0}, {1, 1}
int arr[4] = {0, 0, 0, 0};

for (const auto &res : results)
{
if (res.first == 0 && res.second == 0)
arr[0]++;
else if (res.first == 0 && res.second == 1)
arr[1]++;
else if (res.first == 1 && res.second == 0)
arr[2]++;
else if (res.first == 1 && res.second == 1)
arr[3]++;
}

bool success = arr[1] != 0 && arr[2] != 0;

if (success)
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79699895/how-does-the-single-global-order-in-stdmemory-order-seq-cst-work[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Восхождение в SEQ от NLOG, делая переменную URL SEQ, настраиваемой в NLOG.CONFIG
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Восхождение в SEQ от NLOG, делая переменную URL SEQ, настраиваемой в NLOG.CONFIG
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Как выполняется один глобальный порядок в std :: memory_order_seq_cst?
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Судья 0: «Не удается написать /SYS/fs/cgroup/memory/box-xxx/memory.limit_in_bytes» Ошибка на Ubuntu 24.04
    Anonymous » » в форуме Javascript
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • AppHarbor – /order/rpc.ashx(1): ошибка ASPPARSE: не удалось создать тип «web.order.rpc»
    Anonymous » » в форуме C#
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous

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