
C++
在
C++里,像lock_guard、unique_lock之类的,都属于比较高层次的抽象锁了。而像mutex、recursive_mutex等,也能看作是锁,它们是通过调用操作系统所提供的互斥方案来实现功能的。不管是在用户层面还是系统层面,锁的实现从根本上来说都是依赖原子操作的。换个说法就是,只要具备原子操作,就能够实现各种各样的锁。下面说说Peterson算法,它借助flag和turn的原子性来达成临界区的功能。硬件也有提供一些方案,例如针对单处理器的屏蔽中断方案。其原理是当有进程进入临界区时,处理器就会屏蔽中断。由于中断被屏蔽了,其他进程无法执行,这样就实现了数据保护。不过这种方法存在明显的缺点,它不适用于多处理器,而且把屏蔽中断的权力交给用户进程也是非常危险的。对于多处理器,硬件也提供了有支持作用的方案,如测试并加锁(TSL,Test and Set Lock)。硬件提供了TSL指令,在执行这个指令的时候,CPU会锁住内存总线,使得其他指令无法访问内存,从而实现数据保护。TSL指令对内存的读写操作都是原子性的,所以也能够用来实现锁。此外,CPU还有一个XCHG指令,它能原子性地交换两个位置的内容。前面已经提到过,只要有原子操作就能实现锁。