#lock-free #list #producer-consumer #usize #limited #length #bitmap

lock-free-freelist

适用于多生产者和消费者的快速无锁有限长度空闲链表

1 个不稳定版本

0.1.0 2020年11月29日

#878 in 并发

MIT/Apache

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