并发队列(concurrentqueue)源码详细剖析 [第三篇 - implicit producer批量入队]

109 阅读1分钟

第二篇链接

上一篇我们讲了入队操作,这一篇讲解批量入队.可能会少量涉及上一篇的入队代码.
在开始讲批量入队代码之前,先回顾一下上一篇的Enqueue函数,从块池里面分配块之后,有个成员变量tail_block指向了这个新的块.
image.png
这个变脸在批量入队函数里面会用到.

EnqueueBulk批量入队源码剖析

采用放图片的方式吧,手写代码的话,对于不同平台看起来非常不好

image.png 上面代码定义了start_block,这个代表上一次分配的块.如果是初始什么都没有插入的话,这个值为nullptr.
最后两行代码定义计算跨越的块数,用于判断当前批量插入的元素是否需要跨越块,也就是一个块的剩余空间装不下批量插入的元素了.

image.png image.png 上面的代码,用来判断如果跨越块则分配多余的块. 如果分配块或者获取块索引条目失败的情况,则将之前分配的块回退然后将各变量恢复到函数执行之前的值. 最后返回false表示批量插入失败

image.png 上面代码红圈代码哪一行,就是批量插入元素. 使用重定位new在block的elements元素上构造插入的数据.

image.png 最后将tail_index_设置为批量插入数据后的位置,最后返回true,至此批量插入成功