旗子暗记量mutex是sleep-waiting。
便是说当没有得到mutex时,会有高下文切换,将自己、加到忙等待行列步队中,直到其余一个线程开释mutex并唤醒它,而这时CPU是空闲的,可以调度别的任务处理。
而自旋锁spin lock是busy-waiting。

便是说当没有可用的锁时,就一贯忙等待并一直的进行锁要求,直到得到这个锁为止。这个过程中cpu始终处于忙状态,不能做别的任务。
例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0 和Core1上。 用spin-lock,coer0上的线程就会始终占用CPU。
其余一个值得把稳的细节是spin lock耗费了更多的user time。这便是由于两个线程分别运行在两个核上,大部分韶光只有一个线程能拿到锁,以是另一个线程就一贯在它运行的core上进行忙等待,CPU占用率一贯是100%;而mutex则不同,当对锁的要求失落败后高下文切换就会发生,这样就能空出一个核来进行别的运算任务了。(实在这种高下文切换对已经拿着锁的那个线程性能也是有影响的,由于当该线程开释该锁时它须要关照操作系统去唤醒那些被壅塞的线程,这也是额外的开销)
总结(1)Mutex适宜永劫光加锁和须要就寝的场景。只管比较spin lock它会花费更多的开销(紧张是高下文切换),但是它能适宜实际开拓中繁芜的运用处景,在担保一定性能的条件下供应更大的灵巧度。
(2)spin lock的lock/unlock性能更好(花费更少的cpu指令),但是它只适应用于临界区运行韶光很短的场景。而在实际软件开拓中,除非程序员对自己的程序的锁操作行为非常的理解,否则利用spin lock不是一个好主张(常日一个多线程程序中对锁的操作有数以万次,如果失落败的锁操作(contended lock requests)过多的话就会摧残浪费蹂躏很多的韶光进行空等待)。
(3)中断上半部处理程序不能就寝,只能利用spinlock。
(4)须要就寝、调度的只能利用mutex(或其他类型旗子暗记量)
【本文转发自互联网】