单核,多核CPU的原子操作

Posted tianye_guazi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单核,多核CPU的原子操作相关的知识,希望对你有一定的参考价值。

单核,多核CPU的原子操作

 一. 何谓"原子操作":
原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch).

二. 为什么关注原子操作?
1. 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁. - (巧妙的利用原子操作和实现无锁编程)
2. 借助原子操作可以实现互斥锁(mutex). (linux中的mutex_lock_t)
3. 借助互斥锁, 可以实现让更多的操作变成原子操作. 


三. 单核CPU的原子操作:
在单核CPU中, 能够在一个指令中完成的操作都可以看作为原子操作, 因为中断只发生在指令间.

四. 多核CPU的原子操作:
在多核CPU的时代(确实moore定律有些过时了,我们需要更多的CPU,而不是更快的CPU,无法处理快速CPU中的热量散发问题), 体系中运行着多个独立的CPU, 即使是可以在单个指令中完成的操作也可能会被干扰. 典型的例子就是decl指令(递减指令), 它细分为三个过程: "读->改->写", 涉及两次内存操作. 如果多个CPU运行的多个进程在同时对同一块内存执行这个指令, 那情况是无法预测的. 

五. 如何实现++i和i++的原子性: 
1. 单CPU, 使用锁或则禁止多线程调度, 因为本身单核CPU的并发就是伪并发. (在单核CPU中, 在没有阻塞的程序中使用多线程是没必要的).
2. 多核CPU, 就需要借助上面说道的CPU提供的Lock, 锁住总线. 防止在"读取, 修改, 写入"整个过程期间其他CPU访问内存. (那么“读写,修改,写入”这个操作会不会在在单核中发生线程的切换呢?)

以上是关于单核,多核CPU的原子操作的主要内容,如果未能解决你的问题,请参考以下文章

原子性、可见性、有序性

线程安全之原子操作

JAVA的原子性和可见性,线程同步的理解

读写锁的实现

为什么volatile能保证有序性不能保证原子性

为什么volatile能保证有序性不能保证原子性