Val*_*ani 0 concurrency mutex rust
我无法理解如何在互斥锁中修改 Option。
当没有选项时,它工作正常
let mut my_int = Arc::new(Mutex::new(5));
let my_int_clone = Arc::clone(&my_int);
thread::spawn(move || {
let mut my_int = my_int_clone.lock().unwrap();
*my_int += 1;
}).join();
let my_int_clone_print = Arc::clone(&my_int);
println!("Value: {}", my_int_clone_print.lock().unwrap());
Run Code Online (Sandbox Code Playgroud)
但是,当我将值包装在 中时Some,我必须手动使用ref mut等(我从这里找到它),因为lock().unwrap()返回的是MutexGuard,而不是Option本身。
let mut my_int = Arc::new(Mutex::new(Some(5)));
let my_int_clone = Arc::clone(&my_int);
thread::spawn(move || {
let mut my_int = my_int_clone.lock().unwrap();
match *my_int {
Some(ref mut val) => {
*val += 1;
},
None => {
println!("Value is None. Doing nothing..");
}
}
}).join();
let my_int_clone_print = Arc::clone(&my_int);
println!("Value: {}", my_int_clone_print.lock().unwrap());
Run Code Online (Sandbox Code Playgroud)
知道哪个 Rust 概念会导致这种情况吗?除了Option返回MutexGuard值而不是其原始值之外,还有其他数据类型吗?
实际上,在这两种情况下都会Mutex::lock 返回 Result<MutexGuard, ..>。不过,这种类型具有有趣的 trait 实现:Deref和DerefMut. 这些允许通过*运算符显式取消引用。考虑这个带有显式类型的例子:
let mutex = Mutex::new(1i32);
let mut guard: MutexGuard<'_, i32> = mutex.lock().unwrap();
// This dereferences to &mut i32
// because assignment operator works with &mut self.
*guard = 2;
// Nevertheless, for an explicit borrowing you need &mut
// because otherwise it would be moved from the guard.
let inner: &mut i32 = &mut *guard;
Run Code Online (Sandbox Code Playgroud)
而且,当然,您可以Option类似地使用:
let mutex = Mutex::new(Some(1i32));
let mut guard: MutexGuard<'_, Option<i32>> = mutex.lock().unwrap();
// Directly change inner value
*guard = Some(2);
// or use in match, notice &mut borrowing
match &mut *guard {
Some(x) => *x += 1,
None => {},
}
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个匹配示例与您的完全相同,但使用的语法略有不同。游乐场。
| 归档时间: |
|
| 查看次数: |
1270 次 |
| 最近记录: |