5 个版本
使用旧的 Rust 2015
0.1.4 | 2017年1月13日 |
---|---|
0.1.3 | 2015年5月27日 |
0.1.2 | 2015年4月25日 |
0.1.1 | 2015年4月10日 |
0.1.0 | 2015年4月10日 |
#358 in 内存管理
531 每月下载量
在 8 个Crates中使用(通过 sozu-command-lib)
13KB
240 行
一组可重用值
一个Rust库,提供用于管理可重用值的数据池结构。池中的所有值在创建池时初始化。值可以随时从池中取出。当取出的值超出作用域时,值将返回到池中,并在以后可用。
用法
要使用 pool
,首先将以下内容添加到您的 Cargo.toml
[dependencies]
pool = "0.1.3"
然后,将其添加到您的crate根目录
extern crate pool;
功能
- 简单
- 无锁:值可以跨线程返回到池中
- 存储类型化值和/或内存块
lib.rs
:
预初始化值的存储。
在需要时可以检出值,操作它们,并在超出作用域时自动返回到池中。当处理创建成本高昂的值时可以使用。基于对象池模式。
示例
use pool::{Pool, Dirty};
use std::thread;
let mut pool = Pool::with_capacity(20, 0, || Dirty(Vec::with_capacity(16_384)));
let mut vec = pool.checkout().unwrap();
// Do some work with the value, this can happen in another thread
thread::spawn(move || {
for i in 0..10_000 {
vec.push(i);
}
assert_eq!(10_000, vec.len());
}).join();
// The vec will have been returned to the pool by now
let vec = pool.checkout().unwrap();
// The pool operates LIFO, so this vec will be the same value that was used
// in the thread above. The value will also be left as it was when it was
// returned to the pool, this may or may not be desirable depending on the
// use case.
assert_eq!(10_000, vec.len());
额外字节存储
池中的每个值都可以填充任意数量的字节,可以将其作为切片访问。如果实现类似缓冲池,这很有用。元数据可以存储为 Pool
值,而字节数组可以存储在填充中。
多线程
从池中检出值需要池的可变引用,因此不能在多个线程之间并发发生,但将值返回到池是线程安全的和无锁的,所以如果池中的值是 Sync
,则 Checkout<T>
也是 Sync
。
在多个线程之间共享单个池的最简单方法是将 Pool
包裹在互斥锁中。