1 个不稳定版本
0.1.0 | 2020年11月29日 |
---|
#878 in 并发
24KB
291 行
lock-free-freelist
适用于多生产者和消费者的快速无锁有限长度空闲链表。它适用于消费者和生成器速度相同的情况,因此空闲链表的有限长度并不重要。
它使用 usize 类型的位图来跟踪空闲链表,因此空闲链表的大小等于 usize 中的位数。如果 usize 是 8 字节,则大小为 64;如果 usize 是 4 字节,则大小为 32。
空闲链表只能存储一种类型的空闲指针。例如,
let free_list = FreeList::<Box<i32>>::new(); // a free list for Box<i32>
示例
use lock_free_freelist::{FreeList, Reusable};
use std::{thread, iter};
#[macro_use]
extern crate lazy_static;
#[derive(Reusable)]
struct MyType {
name: String,
age: u32,
}
// from https://crates.io/crates/lazy_static
lazy_static! {
static ref FREE_LIST: FreeList<Box<MyType>> = FreeList::<Box<MyType>>::new();
}
fn main() {
// Spawn 4 threads
// Each thread will allocate elements of type `MyType` using FREE_LIST
let threads = iter::repeat(0).take(100)
.map(|_| {
thread::spawn(|| { for i in 0..1000 {
let my_type = MyType { name: "Jane".to_string(), age: 30 };
let mut my_type_on_heap = FREE_LIST.reuse_or_alloc(my_type);
// This is similar to:
// let mut my_type_on_heap = Box::new(my_type);
// But when using FREE_LIST.reuse_or_alloc(), the dropped
// memory will be reused.
my_type_on_heap.name.push_str(" Doe");
my_type_on_heap.age = i;
}})
})
.collect::<Vec<_>>();
for handle in threads {
handle.join().unwrap()
}
}
依赖关系
~1.5MB
~36K SLoC