gpt4 book ai didi

rust - 如何在不移动 Mutex 变量的情况下使用 Condvar?

转载 作者:行者123 更新时间:2023-11-29 08:28:43 26 4
gpt4 key购买 nike

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

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

fn main() {
let var_in_lock = Arc::new(Mutex::new(8));
let cvar = Arc::new(Condvar::new());

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

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

它不编译:

error[E0382]: use of moved value: `unlocked`
--> src/main.rs:10:19
|
7 | let unlocked = var_in_lock.lock().unwrap();
| -------- move occurs because `unlocked` has type `std::sync::MutexGuard<'_, i32>`, which does not implement the `Copy` trait
...
10 | cvar.wait(unlocked).unwrap();
| ^^^^^^^^ value moved here, in previous iteration of loop

我看过the example在 Rust 文档中。我发现的两个区别是:

  1. 他们成对创建了CondvarMutex。这应该无关紧要,对吧?我想单独创建它们。
  2. 他们使用 ref 关键字匹配锁,如果我理解的话 this回答正确,意味着引用了锁。我认为通过将行更改为 cvar.wait(&unlocked).unwrap(); 会是同一件事,但是编译器会提示 MutexGuard,而不是一个引用,预计。

如何让它编译?

最佳答案

没有发现的区别是 wait 返回 MutexGuard:

pub fn wait<'a, T>(
&self,
guard: MutexGuard<'a, T>
) -> LockResult<MutexGuard<'a, T>>
while !*started {
started = cvar.wait(started).unwrap();
}

wait 取得了 MutexGuard 的所有权,因为它会释放锁并稍后重新获取它。静态转移所有权可防止使用不正确锁定(或解锁)的变量,这是使用 Rust 类型系统为程序员带来优势的一个示例。


您需要在代码中做同样的事情:

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

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

另见:

关于rust - 如何在不移动 Mutex 变量的情况下使用 Condvar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56939439/

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