Geo*_*rge 0 multithreading lock-free spinlock lockless
我想知道无锁编程相对于自旋锁有哪些优点?我认为当我们在一个线程(称为A)中使用CAS机制进行无锁编程时,如果其他线程更改了CAS中的值,A线程仍然需要再次循环。我认为这就像我们使用自旋锁一样!
我对此很困惑。虽然我知道CAS和spin-lock适合在锁争用不激烈的情况下使用,但是谁能解释一下在哪些场景下应该使用lock free,应该使用spin lock?
无锁提供了所谓的进度保证。您是对的,在您的示例线程A中确实执行了重试(即再次循环),但前提是其他线程更改了 value,这意味着该线程能够取得进展。
相比之下,X持有自旋锁的线程(我们称之为)会阻止所有其他线程在锁被释放之前取得进展。因此,如果线程X被抢占,则所有等待锁的线程的执行都会有效地停止,直到X可以恢复执行并最终释放锁。如果X无限期地停止,那么所有其他线程也将无限期地阻塞。
这种情况对于无锁算法是不可能的,因为可以保证在任何时候至少有一个线程可以取得进展。
应该使用哪个取决于情况。无锁算法本质上很难设计,尤其是对于树等更复杂的数据结构。即使你有一个无锁算法,它几乎总是比串行算法慢,所以受锁保护的串行版本可能会表现得更好。再说一次,如果数据结构竞争激烈,则无锁版本将比受锁保护的版本更好地扩展。但是,如果您的工作负载主要是只读的,那么读写锁也将提供良好的可扩展性。不幸的是,这里没有一般规则......
如果你想了解更多关于无锁(以及更多)的知识,我推荐这本书The Art of Multiprocessor Programming。
如果你更喜欢免费的替代方案,我推荐并行编程难吗,如果是,你能做些什么?Paul McKenney 或Keir Fraser 的Practicallock-freedom。