5.2 C++中的原子操作和原子类型
原子操作是一类不可分割的操作,当这样操作在任意线程中进行一半的时候,你是不能查看的;它的状态要么是完成,要不就是未完成。如果从对象中读取一个值的操作是原子的,并且对对象的所有修改也都是原子的话,那么加载操作要不就会检索对象初始化的值,要不就将值存在某一次修改中。
另一方面,非原子操作可能会被视为由一个线程完成一半的操作。如果这种是一个存储操 作,那么其他线程看到的,可能既不是存储前的值,也可能不是已存储的值。如果非原子操 作是一个加载操作,那么它可能会去检索对象的部分成员,或是在另一个线程修改了对象的 值后,对对象进行检索;所以,检索出来的值可能既不是第一个值,也不是第二个值,可能 是某种两者结合的值。这就是一个简单的条件竞争(如第3章所描述),但是这种级别的竞争会 构成数据竞争(详见5.1节),且会伴有有未定义行为。
在C++中(大多数情况下)你需要一个原子类型去执行一个原子操作,所以我们来看一下原子类 型。