第 19 章 并发(2)
吉姆•布兰迪
19.3 共享可变状态
自从你在第 8 章发布了 fern_sim crate,在之后的几个月里,你的蕨类植物模拟软件真的“火”了。现在你正在创建一个多人即时战略游戏,其中 8 名玩家在模拟的侏罗纪景观中竞相种植大部分真实的同时代蕨类植物。该游戏的服务器是一个大规模并行应用程序,要处理从很多线程涌入的大量请求。一旦有了 8 名待加入的玩家,这些线程该如何相互协调以开始游戏呢?
这里要解决的问题是,很多线程需要访问待加入游戏玩家的共享列表。这个数据必然是可变的,并且会在所有线程之间共享。如果 Rust 不支持共享的可变状态,那我们还能用它做些什么呢?
可以通过创建一个新线程来解决这个问题,该线程的全部工作就是管理这个列表。其他线程将通过通道与它通信。当然,这会多占用一个线程,从而产生一些操作系统开销。
另一种选择是使用 Rust 提供的工具来安全地共享可变数据。这种工具确实存在。它们就是任何使用过线程的系统程序员都熟悉的底层原语。本节将介绍互斥锁、读 / 写锁、条件变量和原子化整数。最后,我们将展示如何在 Rust 中实现全局可变变量。
19.3.1 什么是互斥锁
互斥锁(mutex)或锁(lock)用于强制多个线程在访问某些数据时轮流读写。19.3.2 节会介绍 Rust 的互斥锁。先回顾一下互斥锁在其他语言中的用法是有好处的。下面是互斥锁在 C++ 中的简单用法:
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
Rust并发编程中的互斥锁应用 Rust并发编程中的互斥锁是保护共享可变状态的重要工具。本文通过一个多人即时战略游戏的场景引出了互斥锁的作用和优势,包括防止数据竞争、保证操作顺序和支持不变条件编程等。与其他语言不同的是,Rust中受保护的数据存储于Mutex内部,同时Rust的生命周期体系能够确保引用的生命周期不会超出MutexGuard的范围。 文章重点介绍了在Rust中如何使用互斥锁来保护共享可变数据,通过示例代码展示了创建和使用互斥锁的方法,以及在互斥锁的保护下进行共享数据的操作。此外,还介绍了Rust中的读/写锁(RwLock)和条件变量(Condvar)的使用方法,以及原子化类型的概念。 Rust的安全保证可以帮助开发者避免数据竞争,但仍需注意竞态条件和程序设计的影响。文章强调了Rust提供的安全、结构化的通信方式,以及能够让开发者组合多种技术并进行实验的优势。总的来说,本文为想要了解Rust并发编程的读者提供了很好的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论