单核、多核上锁、同步操作、原子操作

(1)      所有的同步操作最基础的理论就是原子操作,内存屏障、锁都是为了保证在不同平台或者cpu下的原子操作。

内存屏障作用:

A:在编译时,拒绝编译器优化之后的指令

B:在运行时,告诉内存地址总线,共享数据地址必须同步

 

锁是内存中一种整型数据,只有两种状态:空闲和上锁。

加锁过程

1、  read lock

2、  判断lock状态

3、  如果已经加锁,返回失败

4、  把锁状态设置为上锁

5、  返回成功

 

(2)      什么情况下会导致不同线程同时得到锁:

1、  中断,上面1到5步骤中出现中断,cpu被抢占

2、  多核,可以同步在不同核心上处理1到5步骤

 

(3)      解决办法

1:单核情况下,可以先关闭中断,加锁后再打开中断。Test-and-Set就是用来做这个事情的。Test-and-Set主要功能,取出内存某一单元的值。还有swap用来交换两个内存单元的值。这两个命令都是原子性的。

2:单核情况下Test-and-Set不会被中断打断所以是原子性的,对于多核来说Test-and-Set就不再是原子性的了。对于多核可以在锁内存总线的情况下进行Test-and-Set。原子操作里面的lock是锁内存总线,这里面的lock是保证执行的执行顺序严格按照lock前,lock中,lock后的顺序执行

你可能感兴趣的:(C/C++)