use std::thread;
use std::sync::Mutex;
use std::collections::VecDeque;
use std::time::Duration;
fn main() {
let queue = Mutex::new(VecDeque::new());
thread::scope(|s| {
//let q_cl = queue
let t = s.spawn(|| {
loop{
let item = queue.lock().unwrap().pop_front();
if let Some(item) = item{
dbg!(item);
}
else{
thread::park();
}
}
});
for i in 1..{
queue.lock().unwrap().push_back(i);
t.thread().unpark();
thread::sleep(Duration::from_secs(1));
};
});
}
我从《rust Atomics and Locks》一书中得到了这段代码,据我所知,互斥体是一种不实现复制特征的数据类型,所以为什么第一个闭包没有借用队列(我来到这个结论是因为队列是在生成函数之外使用的),如果它没有被借用,那么这里到底发生了什么。
那么为什么第一个闭包没有借用队列(我得出这个结论是因为队列是在spawn函数之外使用的),如果它没有被借用,那么这里到底发生了什么。
队列被第一个闭包借用。但互斥体是实现内部可变性的方法之一:
pub fn lock(&self) -> LockResult<MutexGuard<'_, T>>
您只需要互斥锁上的共享引用即可锁定它。
因此
spawn
的闭包采用共享引用,并且循环仍然可以使用现有的共享引用,它们不是排他的(因此 shared)。