Rust 如何在不移动互斥变量的情况下使用Condvar?

Rust 如何在不移动互斥变量的情况下使用Condvar?,rust,condition-variable,Rust,Condition Variable,我想在我的程序中使用Condvar。下面是一个简短的测试。我知道它将永远停留在循环中 使用std::sync::{Arc、Condvar、Mutex}; fn main(){ 让var_in_lock=Arc::new(Mutex::new(8)); 让cvar=Arc::new(Condvar::new()); let unlocked=var_in_lock.lock().unwrap(); 环路{ cvar.wait(解锁).unwrap(); } } 它不编译: 错误[E0382]:使

我想在我的程序中使用
Condvar
。下面是一个简短的测试。我知道它将永远停留在循环中

使用std::sync::{Arc、Condvar、Mutex};
fn main(){
让var_in_lock=Arc::new(Mutex::new(8));
让cvar=Arc::new(Condvar::new());
let unlocked=var_in_lock.lock().unwrap();
环路{
cvar.wait(解锁).unwrap();
}
}
它不编译:

错误[E0382]:使用移动值:`unlocked`
-->src/main.rs:10:19
|
7 |让解锁=var_in_lock.lock().unwrap();
|-----发生移动是因为“unlocked”的类型为“std::sync::MutexGuard”您没有发现的区别是
wait
返回
MutexGuard

pub fn wait<'a, T>(
    &self,
    guard: MutexGuard<'a, T>
) -> LockResult<MutexGuard<'a, T>>
wait
拥有
MutexGuard
的所有权,因为它会释放锁,然后重新获取锁。静态地转移所有权可以防止使用未正确锁定(或解锁)的变量,这是使用Rust类型系统对程序员有利的一个例子


您需要在代码中执行相同的操作:

let mut unlocked = var_in_lock.lock().unwrap();

loop {
    unlocked = cvar.wait(unlocked).unwrap();
}
另见:

所以
wait()
需要在等待时获得
MutexGuard
的所有权,然后将其交回?
let mut unlocked = var_in_lock.lock().unwrap();

loop {
    unlocked = cvar.wait(unlocked).unwrap();
}