直接回答:共享内存路线:Arc<Mutex<T>> 适合临界区短、争用不激烈的场景;Arc<RwLock<T>> 适合读远多于写。消息传递路线:channel(std::sync::mpsc、crossbeam)让所有权在线程间流动,天然避免共享状态。原子类型适合简单计数与标志位。

展开解析:取舍原则:能用 channel 表达的数据流就不要共享内存——锁争用与死锁的排查成本远高于通道。必须共享时优先 MutexRwLock 簿记开销更高,标准库不保证读锁可重入(同线程二次加读锁可能死锁),还存在写者饥饿风险,只有读占比很高且临界区较大才划算。高争用计数器可以分片(sharding,DashMap 的思路)降低锁粒度;需要背压用 crossbeam 有界通道,需要 select 多路复用也用 crossbeam。得益于 Send/Sync,这些选择的线程安全性是编译期强制的。

let n = Arc::new(Mutex::new(0u64));
let c = Arc::clone(&n);
std::thread::spawn(move || { *c.lock().unwrap() += 1; });

let (tx, rx) = std::sync::mpsc::channel::<Job>(); // 所有权随消息转移

追问方向:Mutex 中毒(poisoning)是怎么回事?无锁结构与 Mutex 的性能边界在哪?async 场景为什么不能用 std Mutex 跨 await? (约 540 字)