6 个版本
0.3.1 | 2023年11月12日 |
---|---|
0.3.0 |
|
0.2.1 | 2023年8月19日 |
0.1.2 | 2023年6月17日 |
#283 在 并发
在 microdb 中使用
9KB
93 行
deborrow
安全地将可变引用分割成其字段,并帮助进行引用操作。
它是做什么的?
deborrow!() - 将可变引用分割成其字段。
let fields = deborrow!(object, field1 field2 field3);
*fields.0 = 5;
*fields.1 = ":D";
*fields.2 = Vec::new();
引用 - 一个不安全的、可共享的引用操作类型。
// a crude example. please see examples/reference.rs for one without race conditions.
fn main() {
let mut done: u32 = 0;
for i in 0..5 {
unsafe {
let done_ref = done.as_deborrowed_mut_reference();
thread::spawn(move || {
// do things
*done_ref.as_mut() += 1;
println!("Thread {i} finished ({} done).", done_ref.as_ref());
});
}
println!("{} things done so far.", done);
}
thread::sleep(Duration::from_millis(50));
println!("{} things done.", done);
}
为什么 deborrow!() 是安全的?
这不允许任何生命周期超出对象的主要生命周期。所有生命周期都保持绑定。在这两个条件满足的情况下,即使是正常的 Rust 编译器也允许这种操作:一个具有接收 &mut self 的方法的 struct 可以返回 (&mut A, &mut B, &mut C),其中这是一个包含的字段的元组,同时以可变方式引用。为了演示,请查看示例。bad.rs 无法编译并演示了内存安全性保证,good.rs 演示了宏的预期使用方式,normal.rs 显示了不使用宏的 good.rs 的替代方案。
引用类型有什么用?
如示例中所述,它是为独立线程在不需要完美准确性的应用程序中写入和读取相同缓冲区而设计的,例如在渲染进度条或甚至模拟的输出(在这种情况下,仍需要一些同步代码以避免帧中发生中断)。有一个代理以更易于阅读、高级和详尽的方式执行指针操作会更容易。
它还可以做其他事情(例如,将非可变引用转换为可变引用并断开生命周期)。