Rust在Linux下并发编程可结合标准库、异步运行时及第三方库,以下是关键技巧:
线程创建与管理
使用std::thread::spawn创建线程,通过join()等待线程结束,支持多核并行计算。
use std::thread;
let handle = thread::spawn(|| println!("Hello from thread!"));
handle.join().unwrap();
共享数据同步
Arc提供原子引用计数,Mutex确保互斥访问。use std::sync::{Arc, Mutex};
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
handles.push(thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
}));
}
println!("Result: {}", *counter.lock().unwrap());
消息传递
通过std::sync::mpsc实现线程间通信,避免共享状态。
use std::sync::mpsc;
let (tx, rx) = mpsc::channel();
thread::spawn(move || tx.send("Hello").unwrap());
println!("Received: {}", rx.recv().unwrap());
async/await语法
基于tokio或async-std运行时,实现非阻塞I/O操作,提升并发效率。
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
tokio::spawn(async {
sleep(Duration::from_secs(1)).await;
println!("Async task completed");
}).await.unwrap();
}
异步任务调度
使用tokio::spawn并发执行多个异步任务,支持多线程事件循环。
#[tokio::main]
async fn main() {
let handles: Vec<_> = (0..5).map(|i| {
tokio::spawn(async move {
println!("Task {} started", i);
sleep(Duration::from_secs(1)).await;
println!("Task {} finished", i);
})
}).collect();
for handle in handles {
handle.await.unwrap();
}
}
无锁编程与原子操作
使用std::sync::atomic模块(如AtomicUsize)实现低级无锁操作,减少锁竞争。
use std::sync::atomic::{AtomicUsize, Ordering};
let counter = AtomicUsize::new(0);
counter.fetch_add(1, Ordering::SeqCst);
并发数据结构
利用rayon库实现数据并行处理,适用于批量计算任务。
use rayon::prelude::*;
let sum: i32 = (0..100).into_par_iter().sum();
性能优化策略
tokio,CPU密集型任务可结合线程池。std::thread、std::sync(基础并发原语)。tokio(支持异步I/O和任务调度)、async-std。rayon(数据并行)、crossbeam(高级并发原语,如无锁队列)。通过合理选择同步/异步模型、优化锁使用及利用并行工具,可在Linux下高效实现Rust并发程序。