0.1.2 |
|
---|---|
0.1.1 |
|
0.1.0 |
|
#20 in #最终一致性
17KB
243 行
evc
一个无锁(当读取时),最终一致性同步原语。
该原语使得读写可以同时进行,尽管需要刷新以使写入对读者可见。
此crate与evmap
非常相似,但已推广到任何类型。与包装HashMap的evmap
不同,evc
是更低级的,这意味着您需要能够缓存内部类型(OperationCache
)上所有可能的突变。因此,建议创建一个扩展trait并为WriteHandle<YourType>
实现它,这样就可以使用常规方法(如evmap
内部所做的那样)访问内部数据。
示例
VecWrapper
use evc::OperationCache;
#[derive(Clone, Debug, Default)]
struct VecWrapper(Vec<u16>);
#[derive(Clone, Copy, Debug)]
enum Operation {
Push(u16),
Remove(usize),
Clear,
}
impl OperationCache for VecWrapper {
type Operation = Operation;
fn apply_operation(&mut self, operation: Self::Operation) {
match operation {
Operation::Push(value) => self.0.push(value),
Operation::Remove(index) => { self.0.remove(index); },
Operation::Clear => self.0.clear(),
}
}
}
let (mut w_handle, r_handle) = evc::new(VecWrapper::default());
w_handle.write(Operation::Push(42));
w_handle.write(Operation::Push(24));
assert_eq!(r_handle.read().0, &[]);
w_handle.refresh();
assert_eq!(r_handle.read().0, &[42, 24]);
w_handle.write(Operation::Push(55));
w_handle.write(Operation::Remove(0));
w_handle.refresh();
assert_eq!(r_handle.read().0, &[24, 55]);
w_handle.write(Operation::Clear);
assert_eq!(r_handle.read().0, &[24, 55]);
w_handle.refresh();
assert_eq!(r_handle.read().0, &[]);
许可证
根据您的选择,受以下任何一个许可证的许可:
- Apache许可证2.0版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在作品中的贡献,将根据上述许可证双重许可,没有任何附加条款或条件。