为什么Boost原子示例中的免等待多生产者队列是免等待的

时间:2019-04-11 14:26:12

标签: boost concurrency atomic lock-free wait-free

我对Boost原子示例中的免等待多生产者队列有疑问。 我认为“推”仅是无锁的,而不是等待的,因为存在“ 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_;
};

0 个答案:

没有答案