Почему очередь с несколькими производителями без ожидания в атомарном примере Boost не требует ожидания

У меня есть вопрос об очереди с несколькими производителями без ожидания в примере атомарного повышения. Я думаю, что «push» является только без блокировки, а не без ожидания, потому что есть цикл «compare_exchange_weak», тогда может быть конкретный поток в цикле в течение непредсказуемого времени с помощью какого-то планирования потоков. Кроме того, я думаю, что «поп» не требует ожидания

Есть ли ошибки в моем понимании?

http://www.boost.org/doc/libs/1_63_0_b1/doc/html/atomic/usage_examples.html#boost_atomic.usage_examples.mp_queue

template<typename T>
class waitfree_queue {
public:
  struct node {
    T data;
    node * next;
  };
  void push(const T &data)
  {
    node * n = new node;
    n->data = data;
    node * stale_head = head_.load(boost::memory_order_relaxed);
    do {
      n->next = stale_head;
    } while (!head_.compare_exchange_weak(stale_head, n, boost::memory_order_release));
  }

  node * pop_all(void)
  {
    T * last = pop_all_reverse(), * first = 0;
    while(last) {
      T * tmp = last;
      last = last->next;
      tmp->next = first;
      first = tmp;
    }
    return first;
  }

  waitfree_queue() : head_(0) {}

  // alternative interface if ordering is of no importance
  node * pop_all_reverse(void)
  {
    return head_.exchange(0, boost::memory_order_consume);
  }
private:
  boost::atomic<node *> head_;
};

person Derek Zhang    schedule 11.04.2019    source источник
comment
Я нашел тот же вопрос stackoverflow.com/questions/40756575/, но никто не отвечает на него..... :(   -  person Derek Zhang    schedule 11.04.2019
comment
Я разместил там ответ; это должно быть закрыто как дубликат. (Хороший, интересный вопрос. Такой репост — практически единственный вариант для старых оставшихся без ответа вопросов, которые на самом деле хороши и просто проигнорированы при первоначальной публикации.)   -  person Peter Cordes    schedule 12.04.2019