【发布时间】:2019-07-26 08:39:56
【问题描述】:
我正在生成一个可以做一些工作的线程。有时我希望这个线程在工作完成后死掉,有时我希望它等待更多的工作去做。为此,我传递了Option<Receiver<T>>。如果Option<Receiver<T>> 是None 线程应该终止,否则它应该等待接收更多工作。
fn foo(rx: Option<Receiver<usize>>) {
thread::spawn(move || {
loop {
do_some_work();
if let Some(r) = rx {
match r.recv() {
Ok(x) => {}
Err(_) => panic!("Oh no!"),
}
} else {
break; //Die
}
}
});
}
编译器说:
error[E0382]: use of moved value
--> src/lib.rs:10:25
|
10 | if let Some(r) = rx {
| ^ value moved here, in previous iteration of loop
|
= note: move occurs because value has type `std::sync::mpsc::Receiver<usize>`, which does not implement the `Copy` trait
但是,如果 Receiver 没有包含在 Option 中,一切都很好。
fn foo(rx: Receiver<usize>) {
thread::spawn(move || {
loop {
do_some_work();
match rx.recv() {
Ok(x) => {}
Err(_) => panic!("Oh no!"),
}
}
});
}
【问题讨论】:
-
第一种情况,如果你调用
foo(None),它会启动一个线程,进入循环,测试失败,中断循环,停止线程。那为什么还要启动一个线程呢?你确定不想要Receiver<Option<usize>>吗?这似乎更有意义。 -
@mcarton 我发布了一个修剪过的线程。
//Does work评论代表了大量未显示的工作。如果在线程中传入一个新的usize,会调整一些参数并重做工作。
标签: rust spawn borrow-checker receiver