给定以下代码:
use std::sync::mpsc::{channel, Sender, Receiver};
use std::thread;
fn transceiver(
tx: Sender<u32>, tx_string: &str,
rx: Receiver<u32>, rx_string: &str,
) {
let message_count = 3;
for message in 0..message_count {
println!("message {}: {}", message, tx_string);
tx.send(message).unwrap();
println!("message {}: {}", rx.recv().unwrap(), rx_string);
}
}
fn main() {
let (atx, arx) = channel();
let (btx, brx) = channel();
thread::spawn(move || {
transceiver(atx, "A --> B", brx, "A <-- B");
});
thread::spawn(move || {
transceiver(btx, "B --> A", arx, "B <-- A");
});
}
我没有得到任何输出。我不得不在 main
的末尾添加延迟:
std::old_io::timer::sleep(std::time::duration::Duration::seconds(1));
之后,我得到了这个输出:
message 0: B --> A
message 0: A --> B
message 0: A <-- B
message 0: B <-- A
message 1: B --> A
message 1: A --> B
message 1: A <-- B
message 2: A --> B
message 1: B <-- A
message 2: B --> A
message 2: B <-- A
message 2: A <-- B
文档说这些线程应该比它们的父线程活得更久,但在这里它们似乎会在父线程(在本例中为 main
)死亡后立即死亡。
最佳答案
The doc says these threads should outlive their parents, but here it seems they die as soon as the parent (in this case,
main
), dies.
这不适用于主线程;主线程结束后程序结束。
你想要做的是让主线程等到其他线程完成,即你想将子线程“加入”到主线程。查看join
方法。
let (atx, arx) = channel();
let (btx, brx) = channel();
let guard0 = thread::scoped(move || {
transceiver(atx, "A --> B", brx, "A <-- B");
});
let guard1 = thread::scoped(move || {
transceiver(btx, "B --> A", arx, "B <-- A");
});
guard0.join();
guard1.join();
请注意,当 JoinGuard
下降时,对 join
的调用是隐式的,但为了说明,它们在这里是显式的。
关于multithreading - 为什么这些线程在完成工作之前退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770032/