Rust:Mutex 的示例代码

在Rust中,你可以使用std::sync::Mutex来创建一个互斥锁,从而保护共享资源。下面是一个使用Mutex的简单示例:

rust 复制代码
use std::sync::Mutex;  
use std::thread;  
use std::time::Duration;  
  
fn main() {  
    // 创建一个包含整数的Mutex  
    let counter = Mutex::new(0);  
  
    // 创建多个线程,每个线程都会尝试增加计数器的值  
    let mut handles = vec![];  
    for _ in 0..10 {  
        let counter = counter.clone();  
        let handle = thread::spawn(move || {  
            // 锁定互斥锁以访问内部的值  
            let mut num = counter.lock().unwrap();  
            *num += 1;  
  
            // 假设这里有一些耗时的操作  
            thread::sleep(Duration::from_millis(1));  
        });  
        handles.push(handle);  
    }  
  
    // 等待所有线程完成  
    for handle in handles {  
        handle.join().unwrap();  
    }  
  
    // 锁定互斥锁以读取最终的计数值  
    let result = counter.lock().unwrap();  
    println!("Final Counter: {}", *result);  
}

在这个示例中,我们创建了一个Mutex,它封装了一个整数0。我们然后创建了10个线程,每个线程都试图增加这个计数器的值。由于我们使用了Mutex,我们可以确保在任何时候只有一个线程能够修改计数器的值。

在每个线程中,我们使用lock()方法来获取Mutex的锁。这会阻塞线程,直到它获得锁。lock()方法返回一个Result<MutexGuard, PoisonError>,其中MutexGuard是一个实现了Deref和DerefMut的RAII(Resource Acquisition Is Initialization)风格的封装器,它会在离开作用域时自动释放锁。PoisonError是当互斥锁被毒化(例如,由于内部的数据被破坏)时返回的错误类型。

我们使用unwrap()来简化错误处理,但在生产代码中,你应该更仔细地处理这些可能的错误。

最后,我们等待所有线程完成,并打印出最终的计数值。

请注意,尽管这个示例展示了如何使用Mutex,但在实际的多线程编程中,如果可能的话,你应该优先考虑使用消息传递(例如通过通道)来避免共享状态,因为这通常会导致更简单的代码和更少的同步问题。然而,在某些情况下,共享状态是不可避免的,这时Mutex就是一个非常有用的工具。

相关推荐
码力斜杠哥2 小时前
Rust初习录(6)Rust的 if 玩法
开发语言·python·rust
Rust研习社3 小时前
Rust 的 move 语义,一次讲透
后端·rust·编程语言
WMYeah7 小时前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
楼兰公子20 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
Rust研习社1 天前
开源项目里的 deny.toml 是什么?
后端·rust·编程语言
铭毅天下1 天前
当搜索引擎遇上 Rust——深度解读下一代实时搜索引擎 INFINI Pizza
开发语言·后端·搜索引擎·rust
咸甜适中1 天前
rust语言学习笔记Trait之Default(默认值)
笔记·学习·rust
容智信息2 天前
AI Agent(智能体)的输出格式应该从 Markdown 转向 HTML吗?
前端·人工智能·rust·编辑器·html·prompt
Rust研习社2 天前
Rust Clippy 实用指南:写出更优雅、安全的 Rust 代码
后端·rust·编程语言