生锈线程并移动关键字

问题描述 投票:0回答:1
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》一书中得到了这段代码,据我所知,互斥体是一种不实现复制特征的数据类型,所以为什么第一个闭包没有借用队列(我来到这个结论是因为队列是在生成函数之外使用的),如果它没有被借用,那么这里到底发生了什么。

rust thread-safety
1个回答
0
投票

那么为什么第一个闭包没有借用队列(我得出这个结论是因为队列是在spawn函数之外使用的),如果它没有被借用,那么这里到底发生了什么。

队列被第一个闭包借用。但互斥体是实现内部可变性的方法之一:

pub fn lock(&self) -> LockResult<MutexGuard<'_, T>>

您只需要互斥锁上的共享引用即可锁定它。

因此

spawn
的闭包采用共享引用,并且循环仍然可以使用现有的共享引用,它们不是排他的(因此 shared)。

© www.soinside.com 2019 - 2024. All rights reserved.