2 个版本
0.1.1 | 2019 年 12 月 2 日 |
---|---|
0.1.0 | 2019 年 12 月 2 日 |
#1122 在 并发
24KB
249 行
运行时
run-down
包提供运行时保护实现。
概述
作为模式,运行时保护在需要重新初始化或销毁共享资源的情况下在 SMP 环境中很有用。
该模式有两个部分,一种保证资源可访问并保持访问状态的方法,以及一种使资源从某一点开始不可访问并等待所有未完成的访问结束,以便您可以安全地执行所需操作的方法。
此包的灵感来自 NT 内核中的 运行时保护原语。它在诸如驱动程序卸载等情况中使用,其中需要拒绝对驱动程序的进一步访问,并且卸载线程必须在驱动程序可以完全卸载之前等待进行中的访问停止。
文档
示例
use run_down::{
RundownGuard,
RundownRef
};
use std::sync::Arc;
use std::thread;
use std::time::Duration;
let rundown = Arc::new(RundownRef::new());
for i in 1..25 {
let rundown_clone = Arc::clone(&rundown);
thread::spawn(move || {
// Attempt to acquire rundown protection, while the main
// thread could be running down the object as we execute.
//
match rundown_clone.try_acquire() {
Ok(run_down_guard) => {
println!("{}: Run-down protection acquired.", i);
// Stall the thread while holding rundown protection.
thread::sleep(Duration::from_millis(10));
}
Err(m) => {
println!("{}: Failed to acquire run-down protection - {:?}", i, m);
},
}
});
}
println!("0: Waiting for rundown to complete");
rundown.wait_for_rundown();
println!("0: Rundown complete");
TODO
-
添加一个更有趣的实际示例。
-
添加一些基准测试以查看是否有优化实现的机会。
注意:此包不是由、与或由微软创建、关联或支持。
依赖项
~340–630KB