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)

MIT 许可证

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