在x86架构的CPU中,pause指令会让当前线程暂停一段时间,然后再继续执行。这个暂停的时间通常非常短,只有几个CPU周期。这个指令通常用于自旋锁的实现,以减少CPU的使用率。然而,pause指令并不会导致CPU切换到其他线程。当一个线程执行pause指令时,它仍然占用着CPU,只是在这段时间内,它不会执行任何其他操作。这就是为什么pause指令可以减少CPU的使用率:它让CPU有机会在短暂的时间内停止执行指令,从而减少了CPU的功耗。
pause 指令的作用是暂停流水线并减少功耗,但它并不会让出CPU给其他线程。也就是说,执行 pause 指令的线程仍然处于运行状态,而不是就绪或等待状态。因此, pause 指令并不能让出CPU,它只是让CPU在等待时消耗更少的资源。所以,当你在代码中看到pause指令时,你应该理解为这是一种优化手段,用于减少自旋锁在忙等状态下的CPU使用率,而不是一种让出CPU的方式。因此,即使在自旋等待中插入了pause操作,也不能改变自旋等待在等待获取锁的过程中会占用CPU的事实。简单点说,用pause可以提示CPU接下来的指令序列是用来自旋等待,就不用做memory reorder了,cache什么的也不用废掉了。
Spinlock在不同的操作系统中的实现方式是不同的,不过大体原理是类似的,那就是自旋。什么叫自旋,为什么要自旋呢