目录无锁队列目标传统锁的缺点无锁队列的做法无锁队列的优势适用场景临界区/非临界区无锁队列代传统“加锁”队列的核心技术目标在多线程环境下安全的传递数据避免锁带来的性能损耗和风险传统锁的缺点开销巨大加锁和解锁是重量级操作涉及系统调用和线程切换耗时可能是简单指令的几百倍。优先级反转低优先级线程拿到锁后高优先级线程只能干等导致关键任务被阻塞。死锁风险两个线程互相等待对方释放锁程序直接卡死。阻塞等待线程拿不到锁就会进入休眠唤醒又需要开销。在量化交易这种每微秒都重要的场景这些延迟是不可接受的。无锁队列的做法原子操作精细的内存管理让多线程能够几乎并行地安全访问核心原理使用原子操作依赖CPU提供的“比较并交换”CAS即Compare-And-Swap指令。这是一个不可中断的原子操作先比较内存中的值是否和我预期的一致如果是就把它更新为新值如果不是就重试。这为无锁编程提供了底层基础。设计无锁的算法基于CAS设计算法它保证的是一条CPU指令比如“比较并交换”是不可分割的。安全的连接新的节点或移动队列的“头尾”指针保证在任何时刻队列都处于一致状态不会因线程交错而损坏。总结无锁队列的主要原理是对硬件进行原子操作软件层面就是去使用它。软件算法无锁队列的实现逻辑 - 调用原子库std::atomic - 编译为CAS等CPU原子指令 - 硬件执行保证操作的原子性。无锁队列的优势极致低延迟无锁队列用轻量的CPU指令代替了重量级的操作系统锁延迟能从微秒级骤降至纳秒级这在高频交易中优势巨大。无死锁因为根本上没使用锁死锁风险自然不存在。高鲁棒性即便某个线程被系统暂停也不会阻塞其他线程系统整体稳定性更高。适用场景他的实现非常复杂使用场景十分有限只适合生产者、消费者这种简单的数据传递场景数据传递量小的场景对于复杂的操作临界区很大或者是操作时间很长还是要用锁去处理。无锁队列并不是用来替代所有锁而在关键的数据路径上面让数据的传递更高效。所以无锁队列它是会把一些数据传递的场景去将从毫秒级优化到微秒级或者是纳秒级。临界区/非临界区临界区一段访问共享资源比如全局变量、队列、文件的代码。这段代码不能被多个线程同时执行否则程序就会出错。锁的操作就是对这个临界区进行这个加锁和解锁的操作因为临界区内的资源是共享的资源如果多个线程同时访问这个资源的话就会有数据竞争的现象所以临界区的资源必须是原子性操作临界区的资源必须是原子性操作