MutexT互斥锁Mutual Exclusion是标准库std::sync模块提供的核心同步原语。它的主要作用是‌在多线程环境下保护共享数据确保同一时刻只有一个线程可以访问或修改该数据‌从而避免数据竞争Data Race。8.1Mutex::new(data)创建Mutex‌功能‌创建一个新的Mutex包裹初始数据。‌用途‌初始化共享状态。8.2.lock()阻塞获取锁‌功能‌尝试获取互斥锁。如果锁当前被其他线程持有当前线程会‌阻塞‌进入睡眠状态直到锁被释放。‌用途‌这是最常用的方法适用于必须获取锁才能继续执行的场景。注意事项‌返回的MutexGuard实现了Deref和DerefMut可以直接操作内部数据。当MutexGuard离开作用域时析构函数会自动释放锁。如果前一个持有锁的线程发生了恐慌Panic锁会被标记为“中毒”Poisoned此时.lock()会返回Err。通常使用.unwrap()处理但在生产环境中建议妥善处理PoisonError。usestd::sync::Mutex;fnmain(){letvMutex::new(1);// 1. 获取锁并修改值letmutv1v.lock().unwrap();*v12;println!({:?},v1);drop(v1);// 释放锁// 2. 再次获取锁matchv.lock(){Ok(mutv2){*v23;println!({:?},v2)}Err(e){println!(锁中毒: {:?},e);}}}8.3.try_lock()非阻塞尝试获取锁‌功能‌尝试立即获取锁。如果锁可用则获取并返回Ok(Guard)如果锁已被占用则‌立即返回错误‌不会阻塞当前线程。‌用途‌适用于需要避免死锁、实现自定义重试逻辑、或在无法获取锁时需要执行其他备用逻辑的场景。matchv.try_lock(){Ok(mutv3){*v34;println!({:?},v3)}Err(e)matche{std::sync::TryLockError::Poisoned(_){println!(锁中毒: {:?},e);}std::sync::TryLockError::WouldBlock{println!(锁已被占用: {:?},e);}},}8.4.into_inner()消费Mutex提取数据‌功能‌消费ConsumeMutex本身返回内部包裹的数据T。‌用途‌当不再需要多线程同步希望将数据转移出来时使用。常用于程序结束前获取最终结果或在单线程上下文中解开包装。‌注意‌调用后Mutex实例将被销毁无法再使用。matchv.into_inner(){Ok(mutv4){v45;println!({:?},v4)}Err(e){println!(锁中毒: {:?},e);}}// v 已销毁无法再使用8.5.get_mut()无锁获取可变引用‌功能‌获取内部数据的可变引用mut T。‌用途‌‌无需加锁‌。因为该方法要求借用mut self编译器静态保证了此时没有其他线程或守卫持有该锁。适用于初始化阶段、单线程环境或在确定没有并发访问时的性能优化。‌注意‌如果在多线程环境下错误地使用例如通过unsafe绕过检查会导致数据竞争。letmutvMutex::new(1);matchv.get_mut(){Ok(vv){*vv1;println!({:?},vv);}Err(e){println!(锁中毒: {:?},e);}}8.6PoisonError::into_inner()恢复中毒数据所有返回LockResult的方法lock,try_lock,into_inner,get_mut都可能返回PoisonError。‌恢复数据‌可以通过PoisonError::into_inner()从错误中提取出MutexGuard或数据继续访问。这表示开发者承认数据可能不一致但决定继续使用。matchv.lock(){Ok(mutv2){*v23;println!({:?},v2)}Err(e){println!(锁中毒: {:?},e);letmutv0e.into_inner();// 从错误中提取出 MutexGuard 或数据*v00;// 重新初始化数据为0}}