我对这两个概念有些困惑。
Wiki上无锁的定义:
如果保证,一种非阻滞算法是无锁的 系统范围的进度
非阻滞的定义:
如果失败或任何悬架,则称为非阻滞 线程不会导致其他线程的故障或悬架
我认为Spinlock不含锁,或者至少是非阻滞。但是现在我不确定。因为根据定义,"spinlock is not lock-free"
对我也很有意义。就像,如果持有自旋锁的线被悬挂,则会导致悬挂在外部旋转的其他线程。因此,根据定义,spinlock
甚至都不是非障碍物,更不用说无锁。
我现在很困惑。谁能清楚地解释它?
任何可以称为锁定的东西(从关键部分中排除其他线程直到当前线程解锁为止)是从定义上不含锁定的。是的,Spinlock是一种锁。
如果螺纹握住锁时,则没有其他线程可以获取并进行前进,并且Spinlock无法阻止这一点。即使在临界部分的中间,操作系统也可以随时限定线程。
请注意,"无锁"与"无候补"不同,因此,无锁的算法仍然可以具有诸如CMPXCHG重试循环之类的东西,但是只要一个线程每次都成功,它就是锁免费。
无需等待的算法甚至都无法拥有,最多只需要等待竞争原子操作的高速缓存/硬件仲裁。Wikipedia的非阻滞算法文章更详细地定义了免费和无锁。
我认为您正在混合"阻止"的两个定义。
我想您正在谈论的是尝试获取Spinlock 的spin_trylock
函数,如果失败而不是旋转,则会返回错误。因此,这与非阻滞I/O:失败而不是等待资源可用性,这是非障碍的。
这并不意味着系统中的任何线程都在由Spinlock保护的事物上向前进行。在再次尝试之前,而不是需要使用单独的线程与等待锁定并行做某事。
在无限的环中旋转为阻塞/不制作。对于此定义,纯自旋锁和(在OS辅助)睡觉之前没有区别,直到另一个线程解锁为止。
无锁的定义与浪费CPU时间/力量以腾出独立工作的空间有关。
有些相关:获取无害的Spinlock不需要系统调用,这意味着它是"轻量级"锁。某些锁定实现即使在无害的情况下也总是使用(相对较慢的)系统调用。请参阅Jeff Preshing始终使用轻量级的Mutex文章。还请阅读Jeff的其他帖子,以了解有关无锁编程的更多信息,因为它们很棒。实际上,[无锁]标签Wiki链接到它们。