【发布时间】:2020-06-07 16:17:55
【问题描述】:
我无法理解如何在 Mutex 中修改 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());
但是,当我将值包装在Some 中时,我不得不手动使用ref mut 等(我从here 找到它)因为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());
知道是哪个 Rust 概念导致了这种情况吗?除了返回MutexGuard而不是其原始值的Option之外,还有其他数据类型吗?
【问题讨论】:
-
请注意,在 StackOverflow 上,当问题解决后,提问的人应该accept 最值得回答。这会从未回答的问题列表中删除该问题,为未来的访问者提供关于哪个答案是最佳答案的提示(在原始发布者的眼中),并以象征性声誉奖奖励撰写该答案的志愿者。如果答案不能解决您的问题,您可能需要编辑问题以澄清它。
标签: concurrency rust mutex