linux同步机制
1、自旋锁
获得自旋锁之后禁止内核抢占,但可以被中断上半部打断。运行于中断上下文
单cpu不可抢占内核:空操作
单cpu可抢占内核:禁止内核抢占,不发生自旋
多cpu可抢占内核:禁止内核抢占+自旋
2、互斥锁
内核可以抢占,可以被其他进程抢占,运行于进程上下文
3、读写锁
由于其特殊的逻辑使得其效率相对普通的互斥锁和自旋锁要慢一个数量级,按POSIX标准 在线程申请读锁并未释放前本线程申请写锁是成功的,但运行后的逻辑结果是无法预测。读和写同时获取锁,写具有优先获取。特殊的自旋锁,禁止抢占。
4、顺序锁
对读写锁的一种优化,禁止内核抢占,读和写可以同时进行,多个读者可以同时访问临界资源,但不能同时写
读写可以同时进行这是读写锁不具备的,但使用顺序锁也有限制条件:访问的临界资源不能是指针
5、RCU(read-copy update)
读写可以同时进行,写数据时,先拷贝然后修改,再用更新好的数据覆盖原有数据。
同样获得锁之后禁止内核抢占
6、递归锁
互斥锁的一个特例,互斥锁设置参数PTHREAD_MUTEX_RECURSIVE_NP,运行互斥锁递归加锁和释放锁
7、原子操作
8、信号量
9、信号
10、barrier(信号屏障)
barrier()函数前后的代码执行不能越过barrier