之前,提到了为什么要引入exclusive操作。ARM对于exclusive操作,新增了exclusive指令。
下面以一个例子,来说明下,这个是如何工作的。
以以下代码进行说明,标准的抢锁代码:
线程0执行LDXR指令,exclusive的load操作,读取锁状态。此时线程0的monitor状态变为exclusive状态。
当线程0执行STXR指令,exclusive的store操作,此时monitor状态是exclusive状态,因此store可以成功,W2的值被更新为0。
当线程0的monitor状态从exclusive状态切换到open状态时,硬件会自动将线程1的monitor状态从exclusive状态切换到open状态。因为两个cpu的monitor,检测的地址,是一样的。这种情况下,一个cpu的monitor状态从exclusive状态切换到open状态,硬件就会自动将另一个cpu的monitor状态从exclusive状态切换到open状态。
W2值被更新成0,表示线程1获取到锁。
线程1没有获取到锁,返回执行lock函数。再执行L