3 个版本
使用旧的 Rust 2015
0.1.2 | 2018年11月16日 |
---|---|
0.1.1 | 2018年9月29日 |
0.1.0 | 2018年9月29日 |
#71 in #条件
在 2 个 crate 中使用 (通过 smartpool)
7KB
95 行
原子监视器
原子监视器是一个工具,它像监视器一样对原子数据执行操作,并在某些情况下具有更高的性能潜力。
监视器是一个有用的工具,可以让一个线程在满足某个条件之前阻塞在数据上,而另一个线程可以修改该数据以满足该条件。然而,每次对数据的修改都涉及到互斥锁的获取,这可能会造成不必要的延迟,尤其是在进行简单的原子操作时。
原子监视器提供了一种类似监视器的工具,只有在必要时才进行锁的获取。也就是说,只有当一个线程实际上正在阻塞在某个条件上时——不是当数据仅进行原子修改时,也不是当一个线程阻塞在已经满足的条件上时。
示例
use atomicmonitor::AtomMonitor;
use atomicmonitor::atomic::Ordering;
use std::sync::Arc;
use std::thread;
// atom monitor around an integer
let atom_monitor = Arc::new(AtomMonitor::new(0u32));
// 100 threads which increment the integer 10 times
for _ in 0..100 {
let atom_monitor = atom_monitor.clone();
thread::spawn(move || {
for _ in 0..10 {
atom_monitor.mutate(|atomic_int| {
atomic_int.fetch_add(1, Ordering::SeqCst);
});
}
});
}
// wait until the integer count reaches 1000
atom_monitor.wait_until(|int| int == 1000);
实现
AtomMonitor
包含三个数据,被保护的原子数据、一个原子 通知请求计数器 和一个常规监视器,用于保护 ()
。
对数据进行原子修改时,请求计数器被加载,并且只有当数字为正时,才会获取监视器并发出通知。
在等待数据上的特定条件时,数据被原子加载,并且只有当条件尚未满足时,才会原子地增加请求计数器,监视器会阻塞直到条件满足,然后退出时原子地减少请求计数器。
依赖关系
~0.7–1MB
~16K SLoC