rust 无法移出位于共享引用后面的`*handle`,因为`*handle`具有类型

nfs0ujit  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(116)

我想使用foreach来等待线程终止。但是,出现以下错误,无法实现。请告诉我。

cannot move out of `*handle` which is behind a shared reference  move occurs because `*handle` has type `std::thread::JoinHandle<()>`, which does not implement the `Copy` trait

个字符

js4nwp54

js4nwp541#

正如已经在注解中指出的,解决方案是使用into_iter而不是iter。原因如下:
当调用.iter()方法时,可以重写handles的内容,并获得对vector的共享引用(这意味着,如果handles的类型为Vec<T>,则闭包中的参数的类型为&T)。因此,不能修改vector的内容。
但这正是将handle分配给_时所做的事情(它只是立即删除赋值),因为这个赋值是将值从向量中移到局部变量中。错误消息说,如果JoinHandle要实现Copy,那就没问题。(例如,像整数一样,这些值不会移动,而是在赋值时复制),但它不会。
与此相反,当调用into_iter时,您会得到一个迭代器,它使用向量(向量移动到迭代器中,然后在迭代时消耗迭代器)。在每次迭代中,您都会获得向量的一个元素,但您也会获得该值的所有权,这是可以的,因为向量在迭代后无效。由于您现在拥有handle的所有权,你可以把它移到_中,然后删除它。

sd2nnvve

sd2nnvve2#

从后向前连接矢量。

struct ThreadPool {
    pool: Vec<JoinHandle<()>>,
}

impl ThreadPool {
    pub fn new(size: usize) {
        let mut inst = Self{
            pool: Vec::new(),
        };

        for _ in 0..size {
            inst.pool.push(thread::spawn(move || {
                // do something
            }));
        }
    }
}

impl Drop for ThreadPool {
    fn drop(&mut self) {
        while let Some(handle) = self.pool.pop() {
            let _ = handle.join();
        }
    }
}

字符串
之所以要使用这个函数而不是into_iter()函数,是因为into_iter()函数拥有Vec函数的所有权,这意味着drop()函数无法编译。

相关问题