boost主要提供了三种无锁的方案:
boost::lockfree::queue: 支持多个生产者和多个消费者线程的无锁队列。
boost::lockfree::stack: 支持多个生产者和多个消费者线程的无所栈。
boost::lockfree::spsc\_queue: 仅支持单个生产者和单个消费者线程的无锁队列。但相比于boost::lockfree::queue效率更高。
这些API内部都是通过轻量级原子锁实现但lock\_free,并不是真正意义上的无锁。
还有人借std::atomic实现了一套无锁队列,其内部实现参考了boost::lockfree::queue的设计,适用于多个生产者和多个消费者线程。
实现方式:简单来说,在数据集的每个数据前添加标志(ABA的预防标签),说明是否该数据是否正在被操作,如果被操作,就等待其操作完成,再执行,如果没有就执行下去。
可能会问这个和线程锁有什么不同?
有很大的区别,范围不一样,线程锁是对整个数据集操作锁住。
比如当线程1操作队列的时候,线程2将不能操作,就是说只要队列里任何的数据被操作,其他线程就只能等待其完成。而boost无锁只对队列里面的某一个元素做锁。
试想,多线程同时对队列某个元素访问的概率是非常小的,而且操作完 某个元素的时间也是微乎其微。所以基本上可以说是无锁(lockfree)。
总的来说,无锁其实就是以空间(内存)换效率的做法。牺牲一部分内存(ABA的标签)来换取程序的执行效率。
- c++基础
- 官方在线文档
- auto typename decltype类型推导
- c++常用关键字
- 取消变量未使用警告
- 变量类型
- 字面量
- 指针和引用
- 统一初始化 结构化绑定
- foreach遍历
- using使用
- alignas alignof
- 模板
- 引用和完美转发
- 逗号表达式
- 异常 try catch
- string和string_view
- c++程序退出
- 函数参数类型和个数
- lambda
- 单例模式
- c++标准库
- 文档库
- cmath 算数库
- utilities
- array 数组
- vector 动态数组
- 变量类型推断function
- 正则表达式
- 随机数
- 多线程并发
- cout输出格式化
- 常用std函数
- hash定制
- c++使用第三方库实列
- google glog日志库
- gtest单元测试
- 线程池
- c++ rpc
- Mongoose网络协议
- cpp-httplib
- json ⚡ - JSON for Modern C++
- JeayeSON c++14
- ini文件解析库
- libuv uvw
- boost
- https://www.boost.org/doc/libs/1_79_0/
- ptree ini json xml
- dll
- lockfree
- socket
- cpp serial
- c++常用库列表
- c++常用调试技巧
- 死锁
- valgrind使用
- gdb
- core 生成
- c++编程总览