Header image for 编程题1

编程题1

这是一道融合了高级并发控制、无锁内存管理(Lock-Free Memory Reclamation)与底层系统语义的硬核系统级编程题。

Prompt

题目:实现一个生产级、Wait-Free 读取的 Hazard Pointer 无锁并发跳表(Lock-Free Skip List)背景与动机在多线程高吞吐场景下,基于锁的跳表会有明显的锁争用瓶颈;而常规的无锁数据结构在 C/C++ 等无自动 GC 的语言中,最大的难点在于安全内存回收(Safe Memory Reclamation, SMR)。当一个线程正在读取某个节点,另一个线程将其从跳表中逻辑删除并物理解引用时,直接 free/delete 会引发悬垂指针(Use-After-Free)。核心需求与技术指标语言约束:C++20(使用标准库原子操作与内存模型,禁止使用全局互斥锁 std::mutex 或类似重量级锁)。核心数据结构:多层跳表(Skip List),支持动态层高(最大层高设为 32,生成概率 $p = 0.5$)。接口定义:bool insert(Key key, Value value):插入键值对;若键已存在则更新或返回 false。bool erase(Key key):删除对应键。std::optional<Value> find(Key key):查找键。该操作必须满足 Wait-Free(在有限步内必然返回,无任何重试循环或 CAS 自旋)。内存回收机制(Hazard Pointers):实现基于 Hazard Pointer 的安全回收机制,保障正在被任何线程读取的节点绝不会被物理释放。具备线程退避与批量扫描回收逻辑:当退役节点列表(Retired List)达到阈值 $R$(如 $R \ge 2 \times H$,其中 $H$ 为当前活跃线程的 Hazard Pointer 槽位总数)时,自动执行扫描回收。提供完整的 C++20 实现代码(包含 Hazard Pointer 管理器与跳表本身),并显式标注所有原子操作的 std::memory_order 及其选择依据。

Drag to resize

Response not available

Drag to resize

Response not available

Drag to resize
Drag to resize