在Linux下,Rust使用多线程主要依赖于标准库中的std::thread模块。以下是一个简单的示例,展示了如何在Rust中使用多线程:
Cargo.toml文件中添加threadpool依赖项(可选):[dependencies]
threadpool = "1.8.0"
main.rs,并编写以下代码: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!("子线程结束");
}
在这个示例中,我们创建了一个新的线程,它将在一个闭包中执行。子线程将打印数字1到5,每次打印之间暂停1秒。主线程也会执行相同的操作。handle.join().unwrap()会等待子线程完成。
如果你想使用线程池,可以按照以下步骤操作:
Cargo.toml文件中添加threadpool依赖项(可选):[dependencies]
threadpool = "1.8.0"
main.rs,并编写以下代码: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();
}
在这个示例中,我们创建了一个包含4个线程的线程池。我们使用mpsc::channel()创建了一个通道,用于在线程之间传递消息。子线程将打印数字1到5,每次打印之间暂停1秒,并将数字发送到主线程。主线程也会执行相同的操作,并接收子线程发送的消息。最后,我们关闭线程池。