Почему очередь мультипроизводителя без ожидания в примере атома Boost не требует ожидания - PullRequest
1 голос
/ 11 апреля 2019

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

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

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_;
};
...