Linux 下 Rust 并发编程实战指南
一 环境准备与项目初始化
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh,随后执行 source $HOME/.cargo/env 重载环境。cargo new concurrent_demo && cd concurrent_demo。cargo run;需要调试时使用 gdb 或 lldb,也可借助 IDE 内置调试功能。二 核心并发模型与最小示例
线程与通道
tx 通过 move 转移到子线程;主线程通过 recv() 接收数据。共享内存与同步原语
join() 等待回收。原子操作
异步并发 I/O
并行数据并行
第三方通道与 Actor 生态
三 实战示例 多线程并行计算与原子计数
// Cargo.toml // [dependencies] use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread; fn main() { const N: usize = 10; const INCR: usize = 100_000; // 1) 使用 Mutex + Arc let mtx = Arc::new(Mutex::new(0usize)); let mut handles = Vec::with_capacity(N); for _ in 0..N { let m = Arc::clone(&mtx); handles.push(thread::spawn(move || { for _ in 0..INCR { *m.lock().unwrap() += 1; } })); } for h in handles { h.join().unwrap(); } println!("Mutex 结果: {}", *mtx.lock().unwrap()); // 2) 使用 AtomicUsize let atomic = Arc::new(AtomicUsize::new(0)); let mut handles = Vec::with_capacity(N); for _ in 0..N { let a = Arc::clone(&atomic); handles.push(thread::spawn(move || { for _ in 0..INCR { a.fetch_add(1, Ordering::SeqCst); } })); } for h in handles { h.join().unwrap(); } println!("Atomic 结果: {}", atomic.load(Ordering::SeqCst)); } 四 实战示例 异步高并发回显服务器
// Cargo.toml // [dependencies] // tokio = { version = "1", features = ["full"] } use tokio::net::TcpListener; use tokio::io; #[tokio::main] async fn main() -> io::Result<()> { let listener = TcpListener::bind("127.0.0.1:8080").await?; println!("Listening on 127.0.0.1:8080"); loop { let (mut socket, _) = listener.accept().await?; tokio::spawn(async move { let mut buf = vec![0u8; 1024]; loop { let n = match socket.read(&mut buf).await { Ok(0) => return, // 对端关闭 Ok(n) => n, Err(e) => { eprintln!("read error: {}", e); return; } }; if let Err(e) = socket.write_all(&buf[..n]).await { eprintln!("write error: {}", e); return; } } }); } } 五 性能与工程实践建议