multithreading - 防止应用程序在所有线程完成之前关闭

标签 multithreading rust

这就是我得到的:

extern crate time;

use std::thread;

fn main() {

    let start = time::get_time();
    println!("Starting application");
    do_stuff();
    println!("Total {:?}", time::get_time() - start);

}

fn do_stuff() {

    for i in 0..4i32 {
        thread::spawn(move || {
            thread::sleep_ms(1);
            println!("doing stuff {:?}", i);
        });
    }

}

出于某种原因,我不熟悉应用程序不等待函数 do_stuff() 中的线程完成并关闭。所以这是我得到的输出:

Starting application
Total Duration { secs: 0, nanos: 808482 }

而不是像

Starting application
doing stuff 1
doing stuff 2
doing stuff 3
doing stuff 4
Total Duration { secs: 0, nanos: 808482 }

即使线程未返回任何内容,我如何让应用程序等待线程完成?

最佳答案

spawn 函数返回一个JoinHandle。您可以将所有句柄收集到一个向量中,然后对它们调用 join:

extern crate time;

use std::thread;

fn main() {

    let start = time::get_time();
    println!("Starting application");
    do_stuff();
    println!("Total {:?}", time::get_time() - start);
}

fn do_stuff() {
    let handles: Vec<_> = (0..4).map(|i| {
        thread::spawn(move || {
            thread::sleep_ms(1);
            println!("doing stuff {:?}", i);
        })
    }).collect();

    for h in handles {
        h.join().unwrap();
    }
}

关于multithreading - 防止应用程序在所有线程完成之前关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31046661/

相关文章:

c# - 负载测试服务器登录

java - 为什么在模式对话框关闭之前不调用 done()?

c++ - Poco HTTPServer 连接在调用 stop() 和析构函数后仍然有效

json - Serde JSON反序列化枚举

rust - 从从 JSON 加载的 Vec<(String, String)> 创建 Petgraph 图

rust - 为什么 Rust 需要包和工作空间?

rust - 如何调用系统命令并捕获其输出?

c - 简单的中断处理/多线程程序?

python - python cgi脚本中的线程错误

rust - "cd"执行一系列命令时没有效果