请解释为什么忙碌等待一般皱起了眉头,而纺纱往往被视为好。据我所知,他们都无限循环,直到满足一些条件。Spinlock vs忙等待
回答
A 旋转锁定通常用于资源较少的争用情况,因此CPU只需进行几次迭代即可开始进行高效工作。但是,锁定功能的库实现通常使用自旋锁定,然后使用常规锁定。如果在合理的时间范围内无法获取资源,则使用常规锁定。这样做的目的是通过在快速获取锁的设置中通过上下文切换来减少开销。
术语忙等待往往意味着你愿意旋转并等待硬件寄存器或内存位置发生变化。这个术语并不一定意味着锁定,但它确实意味着等待一个紧密的循环,反复探索变化。
您可能想要使用繁忙等待来检测您想要立即响应的环境中的某种更改。所以使用忙等待来实现自旋锁。在低延迟响应比浪费CPU周期更重要的任何情况下(如在某些类型的嵌入式编程中),忙等待都很有用。
与此相关的是条款«无锁»和«无等待»:
所谓无锁算法倾向于使用紧忙着等待一个CAS指令,但争在普通情况下非常低,CPU通常只需迭代几次。
所谓的等待免费算法根本不会做任何忙碌的等待。
(请注意,«无锁»和«无等待»用来稍有不同的学术背景,看维基百科上关于Non-blocking algorithms文章。)
+1一般,但有点吹毛求疵:古典CAS模式(读CAS-VAR-计算,新价值的尝试-CAS-如果失败的冲洗和重复)并没有真正够得上busy-等待(我们并不是真的在等待一些外部变量_to_change_ - 这可能会花费很长时间,但我们正在等待var从外部干扰中保持稳定 - 在实践中永远不会超过2-3次迭代);仍然 - 这种CAS模式不符合“无等待”的规定:-(。 –
当你理解了规则的确切原因,并有详细平台和应用程序知识,你知道什么时候适合违反该规则。 Spinlocks由专家完成,他们完全理解他们正在开发的平台以及自旋锁的预期应用。
繁忙的等待问题很多,但在大多数平台上都有解决方案。问题包括:
- 对于具有超线程的CPU,正在等待的线程可能会使同一物理内核中的另一个线程挨饿,即使是正在等待的线程也是如此。
- 当你忙于等待,当你最终获得了你正在等待的资源时,你会带走所有错误预测分支的母亲。
- 繁忙的等待会干扰CPU电源管理。
- 繁忙的等待会导致核心总线饱和,因为您持续检查的事件会导致缓存同步流量。
但设计自旋锁的人了解所有这些问题,并且知道如何在平台上缓解它们。他们不写天真旋转码,他们写智能旋转码。
所以是的,他们都无限循环,直到满足一些条件,但他们循环。
- 1. 忙等待在AWT
- 2. 繁忙的等待线程
- 3. 正在忙着等待
- 4. 在C中忙于等待#
- 5. AS3等待/忙碌光标?
- 6. 等待Task.WhenAll vs ..select(async .. =>等待)
- 7. C#异步任务等待VS等待
- 8. 等待时间通过,而不忙在C窗口等待
- 9. 非忙等待的对象初始化
- 10. 调度任务与忙等待
- 11. 忙碌/等待光标在enthought traitsui
- 12. 避免在Access 2003中忙于等待
- 13. 用条件变量替换忙等待
- 14. GCC优化忙等待的死循环
- 15. pthread_cond_broadcast无需在POSIX中忙等待
- 16. C++禁用忙/等待光标
- 17. 这是忙碌的等待吗?
- 18. 忙碌的等待和共享内存
- 19. 忙等待和上下文切换
- 20. ConcurrencyMode多VS异步/等待
- 21. Java信号量默认使用忙等待还是等待/通知?
- 22. 等待vs无等待同步方法(java)
- 23. 有条件的等待vs隐含等待 - 硒
- 24. GLSL SpinLock only Mostly Works
- 25. 等待队列VS信号量在linux
- 26. Parallel.For vs ThreadPool和异步/等待
- 27. 异步和等待vs ThreadPool/TaskFactory
- 28. Python Popen - 等待与通信vs CalledProcessError
- 29. 异步等待vs GetAwaiter()。GetResult()和回调
- 30. 等待VS Task.Result在异步方法
我想在一个自旋锁其实你做其他的东西除了等待其释放... –
不要自旋锁,除非你有,你可以获取一个微秒或更少的锁很好的保证。如果花费更长的时间,它会变成忙等待和错误。 –
使用繁忙等待的锁称为自旋锁 - *现代操作系统* – walkerlala