编程中常见的各种"锁"

1、互斥锁、自旋锁、读写锁、条件锁

2.1、自旋锁(spinlock)

只要加锁(获取锁)失败就会不断尝试解锁。

  • 如果别的线程长期持有该锁,那么当前线程就一直在循环判断,非常浪费 CPU 资源。
while (抢锁(lock) == 没抢到) {
}

2.2、互斥锁(mutex)

加锁(获取锁)失败以后会立即让出 CPU,当前线程被操作系统挂起,等锁的状态发生变化时线程再被唤醒。

  • 互斥器的加锁操作通常都需要涉及到上下文切换,操作花销也就会比自旋锁要大。
while (抢锁(lock) == 没抢到) {
    本线程先去睡了请在这把锁的状态发生改变时再唤醒(lock);
}

2.3、条件锁(condition variable)

与互斥锁类似,但加锁失败进程挂起以及锁状态发生变化时被通知唤醒这些逻辑不是由操作系统完成,而是业务逻辑手动实现。

2.4、读写锁(reader-writer lock)

实际就是由两个spinlock或两个mutex实现的。

2、乐观锁、悲观锁

  • TODO

参考


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com
github