操作系统互斥锁的实现往往借助于硬件原语。就比如TestAndSet()
,在单处理器上在同一时间内不会有两个同时调用,但是在多处理器上可能会有两个或的多个线程同时调用,但是只有一个会获得锁。就好像是两个完全一样的人,在同一时间去面试,面试官相同,但是只录取一个人,也就是说两个人的录取结果一定是不同的。这就很让人费解了,到底为什么一个录取了(获得锁),而另一个没有录取(没有获得锁)呢?还是说这个硬件原语即使是在多处理器上,同一时间也只有一个可以被调用?
如果锁只有一把,那么这里并不表示第二个人没有锁,只是先后顺序,第二个人等第一个人用完了再获取.
在多处理器上,TestAndSet() 硬件原语的实现会使用一些特殊的指令,例如 Compare-and-Swap (CAS) 指令。这些指令可以在多个处理器之间进行原子操作,确保只有一个线程可以成功地获取锁。当多个线程同时调用 TestAndSet() 时,只有一个线程可以成功地将锁的值从未锁定状态改为锁定状态,而其他线程则会失败并等待锁的释放。因此,即使在多处理器上,同一时间也只有一个线程可以成功地获取锁。