学习到的内容:

1.一个64位的int类型值,充分利用高32位和低32位,进行相关加减以及从一个64位中拆出高32位和低32位.

扩展:如何自己实现一个无锁队列.

  • 如何判断队列是否满.
  • 如何实现无锁化.
  • 优化方面需要思考的东西.

2.内存相关操作以及优化

  • 内存对齐
  • CPU Cache Line
  • 直接操作内存.

一、原理分析

1.1 结构依赖关系图

下面是相关源代码,不过是已经删减了对本次分析没有用的代码.

1.2 用图让代码说话

1.3 Put过程分析

Put 过程分析比较重要,因为这里会包含pool所有依赖相关分析.

总的分析学习过程可以分为下面几个步骤:

PpoolLocal
valpoolLocalpoolDequeue
PpoolLocal

4.读写内存优化.

数组直接操作内存,而不经过Golang

uint64headtail

获取P对应的poolLocal

sync.Pool.localPutpidlocal
runtime_procPin

Put 进入poolDequeue队列:

headtailpoolChainEltpoolChain.headnextprev

通过下面代码,我们可以看到,Go通过逻辑运算判断队列是否满的设计时非常巧妙的,如果后续我们去开发组件,也是可以这么进行设计的。

Get实现逻辑:

PutGet

二、学习收获

如何自己实现一个无锁队列. 本文未实现,后续文章会进行实现.

2.1 如何自己实现一个无锁队列

横向思考,并未进行实现,后续会进行实现“

uintptrunsafe.Pointeratomic.CompareAndSwapPointer