1. 线程(Thread):
Rust 的标准库提供了创建和管理线程的功能。
use std::thread;
use std::time::Duration;
fn main() {
// 创建一个新线程
let handle = thread::spawn(|| {
for i in 1..=5 {
println!("Thread: Count {}", i);
thread::sleep(Duration::from_millis(500));
}
});
// 主线程继续执行其他操作
for i in 1..=3 {
println!("Main Thread: Count {}", i);
thread::sleep(Duration::from_millis(1000));
}
// 等待新线程结束
handle.join().unwrap();
}
在这个例子中,thread::spawn 创建了一个新线程,然后主线程和新线程并发执行。通过 thread::sleep 实现线程之间的时间间隔。
2. 消息传递(Message Passing):
Rust 的并发模型也包括消息传递,通过通道(channel)进行线程间通信。
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建一个通道
let (sender, receiver) = mpsc::channel();
// 创建一个新线程,发送消息
thread::spawn(move || {
let val = String::from("Hello from the other side");
sender.send(val).unwrap();
});
// 主线程接收消息
let received = receiver.recv().unwrap();
println!("Received: {}", received);
}
在这个例子中,mpsc::channel 创建了一个多生产者,单消费者的通道。新线程通过 send 发送消息,主线程通过 recv 接收消息。
3. 共享状态(Shared State):
Rust 的 Arc(原子引用计数)和 Mutex(互斥锁)结合使用,可以实现多线程之间的共享状态。
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个可变共享状态
let counter = Arc::new(Mutex::new(0));
// 克隆 Arc,用于多线程共享
let counter_clone = Arc::clone(&counter);
// 创建多个线程,修改共享状态
let handles: Vec<_> = (0..5)
.map(|_| {
let counter = Arc::clone(&counter_clone);
thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
})
})
.collect();
// 等待所有线程结束
for handle in handles {
handle.join().unwrap();
}
// 打印最终结果
println!("Result: {}", *counter.lock().unwrap());
}
在这个例子中,Arc::new(Mutex::new(0)) 创建了一个原子引用计数的互斥锁,用于多线程共享计数器。多个线程通过 lock 方法获取锁,修改共享状态。
Rust 的并发编程支持通过所有权和生命周期来确保线程安全,避免数据竞争和悬垂引用等问题。使用标准库提供的并发工具,可以编写安全、高效的并发程序。
转载请注明出处:http://www.zyzy.cn/article/detail/13734/Rust