#heap #data-structures #reference-counting #immutability #slot #handle #thread-sharable

已撤回 garbo

全局引用计数、线程共享、不可变的堆

0.2.0 2019年7月3日
0.1.0 2019年7月2日

#53#slot

GPL-3.0 许可证

16KB
181 代码行

Garbo

全局引用计数、线程共享、不可变的堆

原理

此软件包提供了一个全局引用计数堆,用于可以由多个线程引用的值。它通过禁止修改存储的值来绕过大多数线程并发访问的问题。

工作原理

该软件包仅导出一个函数;garbo::put,该函数将值放入共享堆中,并返回一个句柄。

句柄是引用计数的,可以在线程之间自由克隆和发送。当最后一个句柄超出作用域时,堆中的相应槽位被标记为空闲,将在下一次调用 put 时重新使用。

只有需要分配新槽位的 put 调用才真正需要等待互斥锁。

示例(来自测试)

// write in one thread, read in the other

let (sender, receiver) = crossbeam_channel::unbounded();

handles.push(std::thread::spawn(move || {
    for i in 0..n {
        let handle = garbo::put(i);
        sender.send((handle, i)).unwrap()
    }
}));

handles.push(std::thread::spawn(move || {
    for _ in 0..n {
        match receiver.recv() {
            Ok((handle, i)) => assert_eq!(*handle, i),
            Err(_) => panic!(),
        }
    }
}));

依赖项

~1.5MB
~24K SLoC