06 Rust中的原子类型

  • 拾一维
  • 更新于 2023-03-09 22:30
  • 阅读 1786

Rust中有两个非常重要的、令人亢奋的篇章,并发编程和异步编程。今天我们来看看和并发有关的原子类型。我们可以使用Rust标准库thread模块下的spawn函数创建线程,它是Rust的原生线程,由操作系统调度,每个线程都有自己的堆栈和本地状态

Rust中有两个非常重要的、令人亢奋的篇章,并发编程和异步编程。今天我们来看看和并发有关的原子类型。我们可以使用Rust标准库thread模块下的spawn函数创建线程,它是Rust的原生线程,由操作系统调度,每个线程都有自己的堆栈和本地状态。多线程或者异步处理是并行的基础,有了这个,我们就可以分派任务高效率的执行了

但是不管我们把一个大的目标细化成了多少个子任务让一众线程执行,最终这些子线程还是要协同完成同一个总目标,而不是各跑各的。这引出了另一个问题,线程信息如何同步,提到这个问题,你是不是第一时间想到了锁?的确,锁是一种解决方案,但是我们今天不展开,我们来先看另一种方案:使用原子类型

1 同步与内存屏障

在展开之前,我们还得稍微再深入一点,聊聊计算机底层

现在计算机内部已经相当复杂,比如使用了三级缓存、多核CPU,也就是说,在计算机内部就涉及各种同步问题,它是用MESI协议来解决的

还有个问题,就是CPU多核之间使用的是异步通信,编译器会对程序指令重排,所以就引入了内存屏障来解决执行乱序指令时也能保正程序的正确性(你可能会疑惑,MESI协议和内存屏障又是啥?问ChaGPT吧)

而Rust的提供的原子类型可以让开发者指定内存顺序(也就是使用哪种内存屏障),注意,它是不受编译器检查的,同unsafe rust一样。先一睹为快

6.1.png

是不是已经麻了?好的不用理解了,学习要不求甚解,先看看,后面再回头来理解吧,先记着下面的使用规则

6.2.png

2 原子类型及方法

Rust中主要的原子类型

6.3.png

原子类型也有一系列的方法供使用,下面是一些比较常用的

6.4.png

在代码中如何指定内存顺序呢?例子如下

6.5.png

3 原子类型的案例

上面讲了很多基础知识,现在我们看一个具体的实现,使用原子类型实现一个锁。在整个过程中,我们也指定了内存顺序,这点需要仔细体会

6.6.png

从上面我们可以看到,原子类型更偏底层。当然使用原子类型在理解和事实上难度更大一些(其实也没有那么蓝的啦,熟能生巧)。好的,那今天的分享就到这了。本节看似就几张图片,但是背后涉及到的很多,得细细咀嚼

示例代码Github地址:

https://github.com/shiyivei/from-principle-to-practice/blob/main/src/spin-lock/examples/atomic_lock.rs

另外,可以选择clone本仓库代码,使用cargo doc --open阅读,体验更佳

git clone git@github.com:shiyivei/from-principle-to-practice.git
cd from-principle-to-practice
cargo doc --open

特别说明:本文中部分整理自张汉东老师的《Rust编程之道》,在此深表谢意

更多内容,欢迎关注公众号拾一维

  • 原创
  • 学分: 4
  • 分类: Rust
  • 标签: Rust 
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
拾一维
拾一维
For science, art and meaning