这是从
我的问题是关于代码片段注释的位置。它被给定为:
数据类型为
下面的代码首先对
Mutex
文档中摘取的例子:
像这样,你可以使用互斥锁来确保在一个特定时间只有一个线程可以访问数据:
use std::sync::{Arc, Mutex};
use std::sync::mpsc::channel;
use std::thread;
const N: usize = 10;
fn main() {
let data = Arc::new(Mutex::new(0));
let (tx,rx) = channel();
for _ in 0..N{
let (data, tx) = (data.clone(), tx.clone());
thread::spawn(move || {
// snippet
});
}
rx.recv().unwrap();
}
我的问题是关于代码片段注释的位置。它被给定为:
let mut data = data.lock().unwrap();
*data += 1;
if *data == N {
tx.send(()).unwrap();
}
数据类型为
Arc<Mutex<usize>>
,因此在调用data.lock()
时,我假设Arc
被自动解引用,并将usize
分配给data
。为什么我们需要再次在data
前面加上*
来解引用它?下面的代码首先对
Arc
进行解引用,然后继续使用只有一个usize
的片段,这也可以代替原始代码片段。let mut data = *data.lock().unwrap();
data += 1;
if data == N {
tx.send(()).unwrap();
}
data
是两种不同的类型。第一个是MutexGuard<T>
,第二个只是一个整数变量。 - Simon Whitehead