请解释为什么"繁忙等待(Busy Waiting)"通常不被看好,而"自旋(Spinning)"经常被认为是可以的。 就我所知,它们都会无限循环,直到满足某些条件为止。
自旋锁通常在资源争用较低且CPU只需少量迭代即可进行有效工作时使用。然而,锁定功能的库实现通常会使用自旋锁后跟常规锁。如果资源无法在合理的时间内获取,则使用常规锁。这样做是为了减少在通常很快获得锁的情况下上下文切换的开销。
术语忙等待倾向于意味着您愿意旋转并等待硬件寄存器或内存位置的更改。该术语不一定意味着锁定,但它确实暗示着在紧密循环中等待,重复探测更改。
您可能希望使用忙等待来检测您想要立即响应的环境中的某种变化。因此,使用忙等待来实现自旋锁。在某些类型的嵌入式编程中,忙等待非常有用,因为非常低的延迟响应比浪费CPU周期更重要。
与此相关的术语是“无锁”和“无等待”:
所谓的“无锁算法”通常使用紧密的忙等待和CAS指令,但在普通情况下争用是如此之低,以至于CPU通常只需要迭代几次。当你理解规则的精确原因并具有详细的平台和应用程序知识时,你就知道何时适当地违反该规则。自旋锁是由专家实现的,他们完全了解他们正在开发的平台以及自旋锁的预期应用。
忙等待的问题很多,但在大多数平台上,都有解决方案。问题包括:
但是设计自旋锁的人员了解所有这些问题,并且知道如何在平台上准确地缓解它们。他们不编写“天真”的自旋代码,而是编写智能自旋代码。
所以,是的,它们都会无限循环,直到满足某些条件,但它们的循环方式是不同的。