问一个关于无锁编程的问题
看了一些说无锁编程的文章,还是有些不太理解到底什么是无锁。 感觉上是说 cas 自旋就是无锁,那自旋锁不也是靠 cas 自旋吗? 所以自旋锁是无锁编程?
看了一些说无锁编程的文章,还是有些不太理解到底什么是无锁。 感觉上是说 cas 自旋就是无锁,那自旋锁不也是靠 cas 自旋吗? 所以自旋锁是无锁编程?
具体的定义在 wiki 里面有写 https://en.wikipedia.org/wiki/Non-blocking_algorithm
A non-blocking algorithm is lock-free if there is guaranteed system-wide progress, and wait-free if there is also guaranteed per-thread progress.
比如一共有 10 个线程,有一个线程在拿着锁的情况下被停了下来,其它的线程也拿不到这个锁,整个系统就停了。
避免这种情况出现的算法叫 lock-free
@anthow 说的实际上更精确,应该叫做无阻塞。
我挖到的最底层是 cmpxchg 指令,再往深没挖了。。
@bugmakerxs CAS 由 cpu 实现者保证至少有一个线程能在任意冲突场景的情况下写入成功(当然,总得符合条件,你不能全部参与比较的都不与原值相等),至于 cpu 怎么实现的,并不重要,因为这属于定义的一部分,不符合这个定义的,就不是这个上下文里的 CAS 操作。
(话说回来,CAS 通常是作为无锁算法实现的基础组件,很少会有恰好只需要 CAS 就可以完成的需求,另外 CAS 也可以用于实现阻塞算法)
原子操作参考 c++里的 atomic 。