std :: memory_order для std :: atomi c<T> :: wait - PullRequest
3 голосов
/ 23 февраля 2020

Согласно cppreference, в C ++ 20 есть wait, notify_one, notify_all в std::atomic<T>. Похоже, они делают std::atomic<T> пригодным для использования как futex .

Я спрашиваю, почему wait принимает std :: memory_order в качестве параметра. Поскольку мне всегда нужно проверять, не является ли пробуждение от ожидания ложным, я укажу порядок памяти в соответствующей загрузке:

  std::atomic<bool> x;

  while (x.load(std::memory_order_acquire) == false)
  {
     x.wait(false, std::memory_order_acquire);
  }

Или я должен указать std::memory_order_relaxed для ожидания? Есть ли сценарий ios с wait, за которым не следует load?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Я отправил эту проблему в GitHub для этого предложения и получил ответ , что std :: atomi c :: wait предназначено для реализации в futex с логами c над ним, специально для маскировки ложных следов.

Итак, cppreference.com ошибается по этому поводу:

Этим функциям разрешено самопроизвольно разблокироваться, то есть возвращаться по причинам кроме изменения значения или уведомления.

И хотя в моем примере l oop является излишним, я должен использовать просто:

std::atomic<bool> x;

x.wait(false, std::memory_order_acquire);
2 голосов
/ 23 февраля 2020

Все операции Atomi c над одним и тем же объектом всегда будут иметь один порядок, и порядок в одном потоке включен в него. Таким образом, relaxed не может переупорядочивать операции atomi c для одного и того же объекта в том же потоке.

Порядок памяти relaxed - это порядок относительно других операций памяти, кроме указанных c atomi c один. Так что relaxed хорошо подходит для проверки самого ожидания, но когда вы действительно хотите прочитать данные, записанные освобождающим потоком, которые не содержатся в значении atomi c, вам понадобится более сильный порядок памяти, чтобы обеспечить их видимость. Поэтому ваш внешний l oop должен использовать более подходящее условие для получения видимости, если это будет необходимо.

...