本篇文章主要用代码代码结合一些图来看。实现一个 无锁哈希表,一共需要考虑实现以下几点:无锁动态数组线程间如何管理内存,避免释放无锁链表下面我们先一一介绍 MySQL 是如何实现的,最后介绍无锁哈希表实现。1 无锁动态数组 LF_DYNARRAYLF_DYNARRAY 总共 分为 4 层,每层能容纳的元素是指数级别增加的,如第 0 层能存储 255 个元素,每个 n + 1 层包含 255 个 n 层顶长数组。这样来支持不同纬度的内存扩展。最长支持 4311810304 个元素。LF_HASH 几乎所有涉及数组部分都是基于 LF_DYNARRAY。typedefstruct{std::atomiclevel[LF_DYNARRAY_LEVELS];// 每个 level 的数组其实地址uintsize_of_element;// 数组 element 占据的内存大小}LF_DYNARRAY;voidlf_dynarray_init(LF_DYNARRAY*array,uintelement_size);几个数组操作重要的函数:// 按 idx 索引数组元素,不存在就申请空间,返回申请空间的位置void*lf_dynarray_lvalue(LF_DYNARRAY*array,uintidx);// 遍历数组元素,调用传入的回调 func,自定义的 func 需要处理每个 level
...
继续阅读
(15)