multithreading - 为什么这些线程在完成工作之前退出?

标签 multithreading rust

给定以下代码:

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/

相关文章:

rust - "mismatched types: expected ` ( )`"在使用 if 表达式时意味着什么?

generics - Rust:从(仅)<T> 不同的函数返回通用结构

rust - 如何使用泛型方法实现特征?

intellij-idea - 如何为 IntelliJ 中的所有 Rust/Cargo 测试设置 --nocapture 标志?

c++ - C++ 队列中的线程池

c# - 在 ASP.Net 站点中使用 AJAX 调用时,REST WCF 服务会锁定线程

java - 适合 RX Completable 的代码不会阻塞 onSubscribe 线程

java - 如何停止包含阻塞操作的线程?

rust - 在结构中实例化 2d Vec?

java - 使用绑定(bind)程序调用服务方法时如何使用线程