本人目前的工作因为涉及到一些内存中的高并发缓存实现,有用到 Cliff Click 大神早年的作品,即 Java 版的NonblockingHashMap, 号称可以 scale 到 768 个 CPU。其思路主要是基于基础的 CAS(比较-交换)原语和精心设计的状态机,来实现 lock-free 的高并发哈希表。当然 lock free 不等于 wait free,但细节这里就不讨论了。
因为自己对 Rust 很感兴趣,就想把 Java 实现移植到 Rust。在 github 上找到 5 年前已经有人做过了类似的工作, 但是是基于当时的 Rust 0.10 ,现在已经完全无法编译,5 年内也没有任何更新。所以就自己 fork 了一份,一边学 rust 一边改旧代码一边加测试,现在已经可以运行原有的一些简单的用例了:
https://github.com/rlei/nonblockinghashmap
我目前所做的改动:
- Rust 0.10 => 1.33 的各种更新与修正:Box 语法,transmute 全部改写为
Box::into_raw
/from_raw
,减少unsafe
使用,解决各种废弃 API 的使用…… - 增加测试并修正发现的 segfault
- cargo 项目定义及标准的代码目录组织(虽然我是
git mv
在移动文件,但因为同时修改内容很多,还是被 git 认为是 rm 和 add,并不是我故意要抹掉原作者的 git history) - Travis CI
目前离实用还差得很远,最严重的问题是原作者在从Java代码移植到rust的时候基本没考虑在unsafe代码里管理内存的问题,有大量的内存泄漏,随便一跑就OOM了。其他正确性和功能性方面也还有很多工作要做。
下一步的计划是增加测试、修正问题,修改接口更符合 rust 标准 API 习惯,重构和清理现有的代码,最终是希望能说服老板用在自己的项目上。
欢迎围观,谢谢 Star 和 PR :D