一、原子操作概念
原子操作是不可分割的操作,在执行完毕时它不会被任何事件中断。
在单处理器中,能够在单条指令中完成的操作都可以认为是原子操作,这是因为指令的中断只能发生在指令与指令之间。而多处理器系统中有多个处理器在独立的运行,即使在能单条指令中完成的操作,在指令执行期间就可能受其他的处理器的影响。这种在指令执行期间的影响的一种情况就是:有很多的汇编指令是“读—修改—写”类型,也就是内存单元作为目的操作数时,实际上这条指令访问了两次内存单元,一次读取,修改之后又有一次写入。这里就出现问题了:在一条指令读之后,另外的一个CPU执行的另一条指令就可能对其进行了一些意想不到的访问。也就是说该操作执行期间有事件中断,它影响了两条指令的执行,造成了结果与预想的可能不一样。
二、原子操作要解决的问题
1.CPU对共享的数据的访问都应该从所有CPU能访问到的地方—内存(寄存器是各自独有)得到。
2.在单指令对内存单元访问完成之前,不允许其他的指令来访问。
针对上面的两个目标,软硬件分别提供了下面的支持:
1C语言的关键字volatile保证对每次从内存中读取该变量,不使用volatile时,编译器会将该变量优化成对寄存器操作。
2.LOCK前缀保证在执行该指令过程中对内存单元的锁定,其他CPU不能访问该内存单元。
原子操作的对象,一个名为atomic_t的结构类型,将atomic声明成结构体的原因:<