Linux下Rust如何使用多线程
Linux下Rust用std::thread::spawn创建线程并用join等待。批量任务推荐线程池与mpsc通道,便于派发与收集结果。线程池大小依任务类型调整:CPU密集型设为核心数,I/O密集型可增多。注意使用Arc或原子操作避免数据竞争,确保线程安全运行。
在Linux环境下用Rust搞多线程,其实比想象中要直白得多。标准库里的std::thread模块已经提供了最核心的工具,上手非常快。下面用一个具体的例子来演示基本线程的创建和同步,看完就能直接用。

先看最基础的场景:创建一个新的线程,让它跟主线程各自打印数字。代码非常简单——调用thread::spawn并传入一个闭包,就能让那段逻辑跑在另一个线程里。
use std::thread;
use std::time::Duration;
fn main() {
// 创建一个线程
let handle = thread::spawn(|| {
for i in 1..=5 {
println!("子线程:{}", i);
thread::sleep(Duration::from_millis(1000));
}
});
// 主线程继续执行其他任务
for i in 1..=5 {
println!("主线程:{}", i);
thread::sleep(Duration::from_millis(1000));
}
// 等待子线程完成
handle.join().unwrap();
println!("子线程结束");
}
这里的关键是handle.join().unwrap()这一行——它会让主线程停下来,直到子线程跑完。如果没有这一行,主线程可能直接结束退出,子线程还来不及执行完。这在多线程编程里是个常见的坑,一定得留心。
如果你需要管理更多的并发任务,或者想避免频繁创建/销毁线程的开销,线程池是个更好的选择。社区里常用的threadpool库可以帮我们轻松搞定。先加依赖:
[dependencies]
threadpool = "1.8.0"
然后就可以用线程池加通道(channel)来实现任务派发和结果收集。下面的例子创建了一个4个线程的池子,子线程通过mpsc::channel把数据传回主线程:
use threadpool::ThreadPool;
use std::sync::{mpsc, Arc};
use std::thread;
use std::time::Duration;
fn main() {
// 创建一个线程池
let pool = ThreadPool::new(4);
// 创建一个通道,用于在线程之间传递消息
let (tx, rx) = mpsc::channel();
// 将发送端克隆并移动到子线程
let tx_clone = tx.clone();
thread::spawn(move || {
for i in 1..=5 {
println!("子线程:{}", i);
thread::sleep(Duration::from_millis(1000));
tx_clone.send(i).unwrap();
}
});
// 主线程继续执行其他任务
for i in 1..=5 {
println!("主线程:{}", i);
thread::sleep(Duration::from_millis(1000));
}
// 接收子线程发送的消息
for received in rx {
println!("收到子线程的消息:{}", received);
}
// 关闭线程池
pool.join();
}
这个例子更接近真实场景:子线程把结果通过通道发回来,主线程可以一边做自己的事一边收消息。最后调用pool.join()确保所有任务完成再退出。话说回来,线程池的大小不是随便定的——它通常跟CPU核心数相关,但如果是I/O密集型任务,可以适当放大。
两个例子的核心差别在于:thread::spawn适合少量、独立的线程;而线程池加通道的组合,更适合批量任务、需要返回结果的场景。从工程角度看,后者才是生产环境里更常用的模式。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















