美文网首页
c++无锁队列

c++无锁队列

作者: 谭英智 | 来源:发表于2023-02-02 16:06 被阅读0次

单生产单消费

ring buffer

  • 两个原子变量 head和tail
  • 通过改变这两个原子变量,来实现入队和出队

多生产多消费

链表+CAS

生产消息

void Enqueue(x):
  auto q = new record();
  q->value = x;
  q->next = null;
  auto p = tail;
  auto null_ptr = null;
  do{
    while (p->next != null)
      p = next;
    null_ptr = null;
  } while(!p->next.compare_exchange_weak(null_ptr, q));

  auto cur = p;
  do{
    p = cur;
  } while(!tail.compare_exchange_weak(p, q);
  • 通过cas修改tail指针

消费消息

record Dequeue(){
  auto p = head;
  do{
    p = head;
    if(p == null) {
        return -1;
    }
  }while(!head.compare_exchange_weak(p, p.next);
  return p->value;
}
  • 使用cas修改head指针

使用链表,会使得访问消息队列cache不亲和

disruptor(ring buffer+CAS)

生产消息

lock-free-queue-disruptor-write
long tryReserveWrite(int n)
{
    if (n < 1)
    {
        return -1;
    }
 
    long current;
    long next;
 
    do
    {
        current = cursor.get();
        next = current + n;
 
        if (!hasAvailableCapacity(gatingSequences, n, current))
        {
            return -1;
        }
    }
    while (!cursor.compare_exchange_weak(current, next));
 
    return next;
}
  • 每个生产端,通过cas抢到需要写的空间,然后写入ring buffer

消费消息

lock-free-queue-disruptor-read
long tryReserveRead(int n)
{
    if (n < 1)
    {
        return -1;
    }
 
    long current;
    long next;
 
    do
    {
        current = reader_cursor.get();
        next = current + n;
 
        if (!checkReadAvailable(gatingSequences, n, current))
        {
            return -1;
        }
    }
    while (!reader_cursor.compare_exchange_weak(current, next));
 
    return next;
}
  • 多消费者,通过CAS reader的游标,来获取需要消费的消息
  • 通过判断available buffer来判断元素是否已经写入完成

使用数组,会让消息队列cache更加亲和

为了避免伪共享,需要把每个原子变量都align cache line的大小

相关文章

  • 无锁队列C++实现

    实现了一个lock free queue,自测通过。有需要的拿去。 #ifndef __LFQUEUE_H__ #...

  • 无锁数组队列

    无锁数组队列

  • 无锁队列

    简介 无锁队列是lock-free中最基本的数据结构,一般应用场景是资源分配,比如TimerId的分配,Worke...

  • 无锁队列

    rte_ring 关键点 无锁: rte_atomic32_cmpset 直到成功(CAS)环: 总长度c...

  • 无锁环形队列

    并发编程中,经常会遇到资源竞争问题,而保持竞争资源的正确使用,可以通过锁的方式,但synchronized blo...

  • JUC并发集合总结

    ConcurrentLinkedQueue 线程安全的支持高并发的队列,使用链表实现。非阻塞,无锁,无界。该队列也...

  • 多线程之非阻塞队列

    ConcurrentLinkedQueue 相对于阻塞队列加锁实现阻塞,非阻塞队列采用无锁CAS的方式来实现。

  • 无锁队列的总结

    首次接触无锁数据结构的设计,请各位大佬多多指教~~~ CAS(Compare && Swap)原子操作 CAS是无...

  • 无锁队列C实现

    入队列 我们可以看到,程序中的那个 do- while 的 Re-Try-Loop。就是说,很有可能我在准备在队列...

  • 内核无锁队列 -- kfifo

    理论证明,在一个生产者和一个消费者的情况下,两者之间的同步无需加锁,即可并发访问。Linux内核无锁队列kfifo...

网友评论

      本文标题:c++无锁队列

      本文链接:https://www.haomeiwen.com/subject/hbtghdtx.html