
C++
一般意义上的锁在
C++ 中通常基于 futex 实现。这里只讨论其原理。简单来说,它依赖一个原子变量(包括值和地址)以及一个系统调用。原子变量的操作由 CPU 硬件支持,通过锁总线或 MESI 协议实现原子级别的加法(Add)和减法(Sub)操作。在加锁的过程中,线程会尝试对原子变量执行 Add 操作并获取返回值。如果返回值为 1,则表示成功获得锁;若返回值不为 1,则说明其他线程已经持有该锁。此时,线程会通过系统调用进入内核态,并为这个原子变量的内存地址创建一个等待队列,同时将自己加入队列。加入队列后,线程会再次检查原子变量的值。如果发现值为 0,则从队列中移除自身并重新尝试加锁流程。解锁时,线程会对原子变量执行 Sub 操作并获取返回值。如果返回值为 0,则无需进一步操作;若返回值不为 0,则进入内核态,从等待队列中取出一个线程唤醒,被唤醒的线程直接进入加锁成功状态。更多详细信息可以通过查阅
man futex 或参考文档 (
http://people.redhat.com/drepper/futex.pdf) 获取。