无锁并发队列的实现

最近看到一份多核环境下无锁并发队列的实现代码,其中巧妙地利用了CAS(compare and set)和memory barrier实现了ring buffer

ring buffer特征:

使用一个环来管理一个队列,而不是使用一个链表。其特征:
  1. FIFO
  2. 最大容量固定;
  3. 无锁实现;
  4. 使用water marking
由于使用一个固定大小的数组来存储元素,所以该队列省去了申请和释放内存的额外开销,只有元素入队列时的一个写入操作。由于是环行队列,使用数组实现时,就不得不用到取余运算,取余运算的开销比较大,这里为了提高效率,使用了二进制运算的与运算,要求队列大小必须是2的幂次,例如2,4,8,...,256等等。

例如给定一个队列容量为size,其队列头为head,队列尾为tail,可以计算其队列目前含有元素:
当前队列存有元素个数= (head-tail) % size = (head-tail) & (size-1)
当前队列空余元素个数= ( size - 1 + tail - head );

由于需要支持多生产者和多消费者的模式,并发情况下,需要一个对队列头和队列尾的操作缓冲——例如一个生产者在往队列中添加元素时,如果只是改变了对头指针,而元素数据还没有来得及写入,此时的消费者是无权读取该新元素位置的数据的。为了做到精确控制,生成者有head和tail两个指针,同样消费者有head和tail两个指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值