Linux四种锁机制(互斥锁、读写锁、自旋锁、RCU锁)

互斥锁

概念
 mutex,用于保证在任何时刻,都只能有至多一个线程访问该资源。当获取锁操作失败时,线程会阻塞直到解锁。

读写锁

概念
 rwlock,分为读锁和写锁。读锁共享,写锁互斥。

 读操作时允许多个线程进行读操作。但是同一时刻只有一个线程可以获得写锁。其他获取写锁失败的线程都会进入睡眠状态,直到写锁释放被唤醒。

 写锁会阻塞其他读写锁,写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

适用场景
 适用于读取数据的频率远远大于写数据的频率的场合。

与互斥锁区别
1.读写锁区分读者写者,互斥锁不区分
2.读写锁允许多个读者同时读对象。

自旋锁

概念
 spinlock,在任何时刻同样只能有一个线程访问对象。

 当获取锁操作失败时, **不会进入睡眠,**而是会在原地自旋,直到锁被释放。这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源。

适用场景
 适用于加锁时间短的环境下

RCU

概念
 read-copy-update,是对读写锁的优化。

 可以随时拿到读锁,但是写锁互斥,写需要先读取数据,然后生成一个副本,对副本修改,修改完成将老数据update成新数据。

 临界区的原始值为m1,如会有人拿到写锁修改了临界区为m2,则在写锁修改临界区之后拿到的读锁获取的临界区的值为m2,之前获取的为m1,这通过原子操作保证

适用场景
 写操作开销大,需要复制。所以在大量读操作,少量写操作的情况下效率高。

猜你喜欢

转载自blog.csdn.net/qq_36459662/article/details/113885666