锁相关
0 前言
自旋锁
自旋锁是位于用户态:忙等待
互斥锁
自旋锁和互斥锁的区别
- 等待策略:自旋锁用户态忙等待;互斥锁内核态休眠。
- 上下文切换:自旋锁一直占用核心,不会让出,所以没有上下文切换;互斥锁如果竞争失败,则会切换。
- 场景:自旋锁适合持锁时间短的场景;互斥锁适用于持锁事件长的场景。具体时间一般以用户 -> 内核内核->用户两段时间的和为界限,如果以下一般使用自旋锁,以上使用互斥锁。
1. 无锁队列实现
ringbuff 实现
实现一个spsc的队列
**注意:**所谓环形队列,其实是逻辑上的,物理存储是连续的缓存空间,通过取余的方式当索引到达尾部的时候重新挪到开头。
注意:根据计算机cpu和core的缓存机制,对一个数据都是存放于64B的cache line中,为了防止头和尾索引放在同一个缓存行导致伪共享,提高性能,所以使用alignas(64) std::size_t read_;的方式进行内存对齐。