在阅读本文章前,先抛出一个问题
如何在不加锁的情况下保证数据的原子性? 原子操作
什么是原子操作
原子操作,表示这个动作/操作是原子性的,是不可被打断或分割的动作。
- 当然,程序级别的原子操作可以是加锁->使用->解锁,这个过程也可以说是原子操作
- 那软件级别的原子操作指的是,依赖于硬件以及系统的支持下,使用原子变量以及原子操作的API来对数据进行的操作。比如使用atomic指定原子变量,或者使用系统API提供的原子操作API函数
下文中的原子操作范指软件级的原子操作
原子操作是如何实现的
原子操作的出现其实依赖于 CPU硬件,也就是计算机硬件和系统的支持。见往期文章 中央处理器中的技术
原子操作的必要条件
硬件和操作系统(甚至编译器)的支持。为什么?
- 看过文章之后,不难理解要实现原子操作首先硬件要支持总线LOCK#或支持缓存一致性规则
- 其次,要在高级语言(除汇编外)使用原子操作,也必须依赖系统和编译器支持,系统或接口中要有相应API,编译器也要认识你写的这些调用
思考
在 C++11 新特性中提到了 atomic,可以对类型指定为原子变量,那么你知道什么类型的变量可以被指定为原子变量吗?