想了解spsc?这篇文章帮你快速入门!

天美租号

今儿个咱来聊聊 SPSC 这玩意儿,听起来挺唬人,就是个单生产者单消费者队列。别看它名字里又是“单”又是“队列”的,好像挺复杂,实际上弄起来比想象中简单多。

我也不知道这玩意儿是就知道它跟“无锁”这俩字儿挂钩。无锁多线程编程里,锁这玩意儿就是个麻烦精,能不用就不用。于是我就开始在网上到处搜资料,想看看这 SPSC 到底是个

第一步,当然是先搞懂原理。

想了解spsc?这篇文章帮你快速入门!

网上那些文章,上来就讲什么 Lamport、顺序一致性,看得我头都大。后来总算找到一篇稍微“说人话”的文章,大概意思是:

  • SPSC,就是一个只能有一个生产者往里写数据,一个消费者从中读数据的队列。
  • 因为只有一个生产者和一个消费者,所以很多事情都变得简单,可以不用锁来实现。

第二步,开干!

想了解spsc?这篇文章帮你快速入门!

光看理论不行,还得动手实践。我找个最简单的 SPSC 实现,就是一个循环数组,外加两个指针,一个指向队头,一个指向队尾。写数据的时候,就往队尾指针指的地方写,然后把队尾指针往后挪一位。读数据的时候,就从队头指针指的地方读,然后把队头指针往后挪一位。就这么简单!

代码写好后,我写个简单的测试程序,一个线程拼命往里写数据,另一个线程拼命往外读数据。跑起来一看,还真行!数据没写错也没读错,而且速度还挺快。

第三步,琢磨点儿更高级的。

基本的 SPSC 实现跑通,我又开始琢磨,能不能再快点儿?毕竟这玩意儿就是为高性能而生的嘛

我又回去翻翻之前看的那些文章,发现有个词儿出现的频率挺高:lazySet。这又是

继续查资料,原来这 lazySet 是 Java 里的一种操作,它可以让写操作更快。大概意思是,普通写操作,写完之后要保证其他线程立刻能看到。而 lazySet ,不保证立刻能看到,但最终肯定能看到。这有啥好处?好处就是,少一些同步操作,速度自然就快。

想了解spsc?这篇文章帮你快速入门!

我试着把代码里的普通写操作换成 lazySet,再跑测试程序,发现速度还真提升一点儿。虽然提升幅度不大,但蚊子腿也是肉嘛

这回折腾 SPSC,从一开始的一头雾水,到基本搞明白,还做点儿小优化,感觉收获还是挺大的。总结起来就几句话:

  • SPSC 就是个单生产者单消费者队列,因为“单”,所以可以不用锁。
  • 最简单的 SPSC 实现,就是一个循环数组加两个指针。
  • 想了解spsc?这篇文章帮你快速入门!

  • 用 lazySet 可以让写操作更快一点儿。

SPSC 这玩意儿还有很多可以深入研究的地方,比如内存屏障、伪共享什么的。不过对我来说,目前这些已经够用。以后有需要再继续研究。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,67人围观)

还没有评论,来说两句吧...