一个讲解lock的视频
https://www.infoq.com/presentations/go-locks/
https://www.zhihu.com/question/332113890
所谓的lock,就是以内存中的某个变量作为标记,来记录目前锁的状态信息。
由于并发访问的存在,对锁变量的修改不能采用read-modify-write方法,但是在read和write中间这段时间,变量可能被其他cpu访问并操作,从而导致不一致。因此需要原子操作,来保证一致性。常见原子操作有CAS(compare and swap),Fetch And Add,Exchange等,见https://zhuanlan.zhihu.com/p/160185717
保证了指令的原子性以后,还要保证指令的顺序不被打乱。这里涉及到编译器的指令重排和cpu的指令重排。同样需要使用对应平台的相关指令(x86下的是lfence,mfence等)。
保证了这两点,就可以有一个简单的自旋锁了。除了自旋锁,还有互斥锁。两者的区别就是在发现锁已被占用以后选择怎么操作。自旋锁选择用cpu忙等,互斥锁选择让操作系统在锁状态发生变化的时候调度自己,然后自己主动放弃执行权,让操作系统调度其他进程/线程执行。