mutex lock是建立在操作系统给的特殊指令上的一种软件解决方法。 实际上就是test_and_set 以及 compare_and_swap 等指令的高级调用。当然,这里的test and set 和 compare and swap不是具体实现在某个平台的指令,只是抽象的定义了两类的指令。 如果不熟悉test and set的话,那么test and set指令的定义是这样的 当然,这只是定义,整个命令是作为一个atomic的指令的。 利用test and set命令来实现互斥是这个样子的: lock 一开始被初始化为false,然后执行第一句while(tas(&lock)) 的时候 会发生两件事情,第一个就是这句话本身结果是false,这样就允许该线程接着往下执行进入临界区,第二个是这句话将lock赋值成true。 而当lock 取true值的时候,第二个线程如果执行第一句while(tas(&lock))的话,会无限循环busy waiting。就进不了临界区,直到第一个线程将lock 设置为false。 那个时候第一个线程也就已经离开临界区了,就达到了互斥的效果。 compare_and_swap的指令定义如下: 使用cas命令的互斥: cas命令的分析也不难。 以上两个是操作系统提供的硬件的解决方法。但很可惜的是,用户程序一般不用汇编开发。所以类似于pthread ,windows都会提供软件上的解决方法。 最直接的思路就是mutex lock:在进入临界区之前应当获得一个lock,其他没有lock的线程就进入不了临界区,离开临界区应该释放掉这个lock,以便其他线程获得lock。 lock 的两个动作 ---获得,释放的定义如下: 要注意的是,acquire和release都是atomic的。 看到acquire的定义的时候是不是感觉到了一股既视感?回想一下tas里,第一句while执行的时候的两个动作,我们将lock 从 false变成 true,我们 tas指令返回false,从而使得while空循环不执行。 在这里,available默认为true,从而使得while空循环不执行,然后我们将available从true变成了false。 把lock 看成 (!available),我们知道tas固定设置lock = true ,也就是available = false; 这里用tas实现一下acquire : tas(&lock)返回false,进入临界区,同时lock = true 阻碍了其他进程进入临界区。 但是因为tas命令只能实现lock = true 也就是available = false,所以我们无法用它来实现release,这个时候就可以用cas命令 而release实现如下: 当lock = false 的时候,我们将他改变成true。 于是我们现在有了TSL和mutex lock了。