计算机
c base
c++ 基础 作用域及生命周期
c++ template
c++ 内存视角
c++ 函数
c++ 基础 基础语法
c++ 性能
c++ 类 基础
c++ 类 对象模型 类析构
c++ 类 设计模式
C++ STL
cmake
CMAKE环境搭建 windows
创建第一个cmakelists.txt
构建稍复杂的项目
动态链接库
EX1
EX1 START
EX1 ANSWER
EX2
EX2 START
EX2 ANSWER
EX3
EX3 START
EX3 ANSWER
变量
控制流程
函数和宏
查找和使用外部库
生成器表达式
qt
qt c++
qt index
qt qml quick
qt ui
qt 多线程
理解QObject 1
理解QObject 4
C++ 技巧 反射
理解QObject 2
理解QObject 3
理解QObject 6
理解 QObject 5
QCoreApplication
QApplication
数据结构
PC问题监控及排查
PC程序性能优化
OS
TOOL
编程漫谈
sealos+frp,搭建内网穿透
host主机配置
C++实战 主题
多线程
生产者-消费者流水线
IO
网络
Bilinotes搭建
编译原理
WEB开发
TS
HTML CSS JAVASCRIPT
本站点使用 MrDoc 构建
-
+
多线程
发布于 2025-06-04 09:43 atomic、memory_order、fence、线程池 std::async, std::future, std::promise, std::atomic 基础层(必须掌握) ├── std::thread 创建和管理 ├── std::mutex + std::lock_guard ├── std::condition_variable └── std::atomic 基础 进阶层(实战常用) ├── std::unique_lock(灵活锁管理) ├── std::shared_mutex(读写锁) ├── std::async + std::future ├── 线程池设计与实现 └── 常见并发模式 高阶(性能优化) ├── 内存序(memory_order) ├── 无锁数据结构 ├── 工作窃取算法 ├── 缓存优化(伪共享) └── 协程(C++20 coroutine) # 并发编程模型 1 Reactor + Thread Pool //IO密集型 2 per thread one loop + event loop + 任务队列 event loop模型没有标准实现,如果自己写代码,尽可能按所用Reactor的推荐方式来编程 3 Proactor + 异步IO 4 数据并行模式 message passing //消息传递 shared memory //共享内存 基本线程原语选用: Thread、mutex、Condition <thread> <Boost.Thread> //使用这两个库 任务队列执行模式: //队列是调度机制,执行方式取决于消费者设计 串行执行、并行执行、混合模式 串行方案:QObject+信号槽 并行方案:QtConcurrent  ## IO模型 阻塞IO 非阻塞IO select/poll epoll/kequeue 信号驱动IO 异步IO //高性能服务器 Reactor //事件驱动 Proactor Reactor模式: ``` ┌─────────────┐ ┌─────────────┐ │ Reactor │←───→│ Event Demux │ └─────────────┘ └─────────────┘ ↑ │ 分发 ↓ ┌─────────────┐ │ Event Handler│ └─────────────┘ ``` Reactor:事件循环核心,负责调度 Event Demultiplexer:系统级I/O多路复用(select/poll/epoll) Event Handler:具体事件处理接口 Concrete Event Handler:实际事件处理实现 ## 任务调度与协调 任务队列+线程池 BlockingQueue 生产者消费者队列 阻抗匹配: 密集计算所占时间比重P(0<P<=1),系统共有C个CPU,为了让这C个CPU跑满而又不过载。线程池大小公式:T=C/P P<0.2,这个公式就不适用,T可以取一个固定值,比如5\*C。 # shared memory race condition 死锁: ```scss void func1() { LOCK(&mutex_a); LOCK(&mutex_b);//线程1停滞在此 counter++; UNLOCK(&mutex_b); UNLOCK(&mutex_a); } void func2() { LOCK(&mutex_b); LOCK(&mutex_a);//线程2停滞在此 counter++; UNLOCK(&mutex_a); UNLOCK(&mutex_b); } ``` # 多线程 线程管控 基本管控 向线程函数传递参数 移交线程归属权 运行时选择线程数量 识别线程 线程间共享数据 并发操作同步 c++内存模型和原子操作 设计基于锁的并发数据结构 设计无锁数据结构 设计并发代码 线程间切分任务的方法 先切分数据,再开始处理 递归方式划分数据 依据工作类别划分任务(分离关注点、) 问题点:线程间有大量共享数据(说明划分不对) 线程间按流程划分任务 影响并发代码性能的因素 处理器数量 数据竞争和缓存乒乓 数据的紧凑程度 过度任务切换和线程过饱和 设计数据结构提升多线程性能 针对复杂操作的数据划分(数组操作) 其他数据类型:(缓存一致性协议(MESI)的强制同步;锁和数据再同一缓存行会破坏A的数据独占,造成性能损失) 高级线程管理 并行算法函数 多线程应用的测试和除错 ## 常见多线程模式 | 模式 | 描述 | 适用场景 | | :--- | :--- | :--- | | **生产者-消费者** | 生产数据,消费数据 | 队列处理、流水线 | | **领导者-追随者** | 一个领导者监听,其他等待 | 事件循环、服务器 | | **线程池** | 任务队列 + 工作线程 | 大量短任务 | | **Actor模型** | 每个Actor独立运行,消息传递 | 分布式、高并发 | | **流水线** | 多阶段处理,每个阶段独立 | 数据处理流 | | **分治(Divide and Conquer)** | 分解任务,并行处理,合并结果 | 并行算法、递归分解 | ## 常见问题及解决方案 | 问题 | 原因 | 解决方案 | | :--- | :--- | :--- | | **竞态条件** | 多线程访问共享数据无同步 | 互斥锁、原子操作 | | **死锁** | 锁顺序不一致 | 固定顺序、`std::lock()` | | **活锁** | 线程不断改变状态,相互谦让 | 退避策略、指数退避 | | **优先级反转** | 低优先级占用锁,高优先级等待 | 优先级继承、优先级天花板 | | **ABA问题** | CAS操作中的陷阱 | 带标记的指针、RCU | | **虚假唤醒** | 条件变量无故唤醒 | `while`循环检查条件 | | **内存可见性** | 编译器/CPU重排指令 | 内存屏障、原子操作 |
peipeo
2026年7月6日 22:21
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码