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;
}
}
});
}
}
五 性能与工程实践建议