0.2.0 |
|
---|---|
0.1.0 |
|
#53 在 #slot
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