我想使用foreach来等待线程终止。但是,出现以下错误,无法实现。请告诉我。
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
个字符
js4nwp541#
正如已经在注解中指出的,解决方案是使用into_iter而不是iter。原因如下:当调用.iter()方法时,可以重写handles的内容,并获得对vector的共享引用(这意味着,如果handles的类型为Vec<T>,则闭包中的参数的类型为&T)。因此,不能修改vector的内容。但这正是将handle分配给_时所做的事情(它只是立即删除赋值),因为这个赋值是将值从向量中移到局部变量中。错误消息说,如果JoinHandle要实现Copy,那就没问题。(例如,像整数一样,这些值不会移动,而是在赋值时复制),但它不会。与此相反,当调用into_iter时,您会得到一个迭代器,它使用向量(向量移动到迭代器中,然后在迭代时消耗迭代器)。在每次迭代中,您都会获得向量的一个元素,但您也会获得该值的所有权,这是可以的,因为向量在迭代后无效。由于您现在拥有handle的所有权,你可以把它移到_中,然后删除它。
into_iter
iter
.iter()
handles
Vec<T>
&T
handle
_
JoinHandle
Copy
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()函数无法编译。
2条答案
按热度按时间js4nwp541#
正如已经在注解中指出的,解决方案是使用
into_iter
而不是iter
。原因如下:当调用
.iter()
方法时,可以重写handles
的内容,并获得对vector的共享引用(这意味着,如果handles
的类型为Vec<T>
,则闭包中的参数的类型为&T
)。因此,不能修改vector的内容。但这正是将
handle
分配给_
时所做的事情(它只是立即删除赋值),因为这个赋值是将值从向量中移到局部变量中。错误消息说,如果JoinHandle
要实现Copy
,那就没问题。(例如,像整数一样,这些值不会移动,而是在赋值时复制),但它不会。与此相反,当调用
into_iter
时,您会得到一个迭代器,它使用向量(向量移动到迭代器中,然后在迭代时消耗迭代器)。在每次迭代中,您都会获得向量的一个元素,但您也会获得该值的所有权,这是可以的,因为向量在迭代后无效。由于您现在拥有handle
的所有权,你可以把它移到_
中,然后删除它。sd2nnvve2#
从后向前连接矢量。
字符串
之所以要使用这个函数而不是into_iter()函数,是因为into_iter()函数拥有Vec函数的所有权,这意味着drop()函数无法编译。