gpt4 book ai didi

rust - 为什么这个值在上次使用后没有下降?

转载 作者:行者123 更新时间:2023-12-05 09:25:46 25 4
gpt4 key购买 nike

以下代码死锁,因为互斥体在上次使用 v 后未解锁:

use std::sync::{Arc,Mutex};

fn main() {
let a = Arc::new(Mutex::new(3));
let mut v = a.lock().unwrap();
*v += 1;
println!("v is {v}");
// drop(v);
let b = Arc::clone(&a);
std::thread::spawn(move || {
let mut w = b.lock().unwrap();
*w += 1;
println!("w is {w}");
}).join().unwrap();
}

解决方法是取消对显式 drop(v) 的注释。为什么编译器在上次使用后不会自动删除 v

相比之下,Rust 编译器知道在以下情况下尽早正确删除 v:

fn main() {
let mut a = 3;
let v = &mut a;
*v += 1;
println!("v is {v}");
let w = &mut a;
*w += 1;
println!("w is {w}");
}

这种行为看起来很自然,我希望编译器在上面做同样的事情。

最佳答案

值在其范围结束时被丢弃,而不是在它们最后一次使用之后。可能会让您感到困惑的是,借用检查器知道引用在它们最后一次使用后是无关紧要的,因此为了执行 Rust 的引用保证而以不同的方式考虑它们的生命周期。 p>

从技术上讲,第二个示例中的 v 直到范围末尾都不会被删除,但是没有引用的删除逻辑。参见 What are non-lexical lifetimes?

关于rust - 为什么这个值在上次使用后没有下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75127521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com