引言
在现代计算机体系中,并发(Concurrency)与并行(Parallelism) 已成为软件开发的核心能力。多核处理器普及之后,单线程程序已经难以充分利用硬件资源。C++ 作为系统级语言,从 C++11 开始标准化引入了 多线程支持库,包括 std::thread、互斥锁、条件变量、原子操作等,为开发者提供了跨平台、标准化的并发编程能力。
本文将系统讲解 C++ 并发编程的基础、线程管理、同步机制、内存模型、常见陷阱以及在工程中的应用。
一、并发与并行的区别
-
并发(Concurrency):逻辑上多个任务交替执行,不一定同时运行。
-
并行(Parallelism):多个任务真正同时运行,通常依赖多核 CPU。
在 C++ 编程中,std::thread 提供并发执行的基本单元,而线程调度是否并行取决于硬件和操作系统。
二、C++ 多线程基础
1. std::thread 的使用
C++11 提供了跨平台的 std::thread 类来创建线程:
-
join():阻塞等待线程结束。 -
detach():让线程在后台运行,主线程不再管理它。
2. 可调用对象作为线程函数
也可以传入 lambda 表达式:
三、线程间的数据共享与问题
1. 竞态条件(Race Condition)
多个线程同时访问和修改共享数据,会产生不可预测结果。
原因是 counter++ 并不是原子操作。
2. 解决方法
-
互斥锁(Mutex)
-
原子操作(Atomic)
四、互斥与同步机制
1. std::mutex
互斥锁保证同一时刻只有一个线程访问临界区。
-
lock_guard:自动加锁与解锁,避免忘记释放锁。 -
unique_lock:更灵活,可延迟上锁、解锁重锁。
2. 条件变量 std::condition_variable
用于线程间通信(生产者-消费者模型):
3. std::future 与 std::async
异步任务执行:
五、原子操作与内存模型
1. std::atomic
无需锁即可保证原子性:
2. 内存模型
C++ 内存模型定义了多线程程序中内存访问的规则:
-
顺序一致性(默认)
-
松弛内存序(relaxed)
-
获取/释放语义(acquire/release)
例如:
这类细节适合性能敏感的并发程序。
六、常见并发模式
1. 生产者-消费者模式
-
使用队列存储任务。
-
condition_variable协调。
2. 读者-写者问题
-
读多写少时使用 读写锁(shared_mutex) 提升性能。
3. 线程池(Thread Pool)
C++ 标准库没有提供线程池,但可自行实现:
七、并发编程中的陷阱
-
死锁(Deadlock)
-
多个线程相互等待,导致程序卡死。
-
避免方法:锁顺序一致、使用
std::lock。
-
-
活锁(Livelock)
-
线程不断重试,消耗 CPU 但无法前进。
-
-
饥饿(Starvation)
-
低优先级线程一直得不到执行。
-
-
竞态条件
-
必须通过锁或原子操作解决。
-
八、工程应用场景
-
服务器并发处理请求(线程池)。
-
并行计算(矩阵运算、多媒体处理)。
-
异步 I/O(日志、文件读写)。
-
实时系统(机器人控制、嵌入式)。
九、性能优化建议
-
避免频繁创建销毁线程,使用线程池。
-
锁粒度尽量小,减少临界区。
-
合理使用原子操作替代互斥锁。
-
避免 false sharing(伪共享),注意缓存对齐。
十、总结
C++11 以来的并发编程库极大简化了跨平台多线程开发:
-
std::thread提供线程创建与管理。 -
std::mutex、condition_variable等保证线程同步。 -
std::atomic提供无锁原子操作。 -
线程池与异步任务模式提升性能与扩展性。
并发编程强大但危险,稍有不慎就会引入死锁、竞态条件等问题。作为开发者,应结合 语言特性 + 工程经验,编写安全高效的多线程程序。
聊 糯 虱 蒲 屉 悯 憋 鸥 缔 伺 躯 礁 栓 剿 觅 帚 锉 驮 厢 擅 炫 署 拇 袱 蟹 颁 慷 拭 痢 苇 蚯 螃 娜 颖 奄 琼 *** 烙 樊 栈 窘 吻 铣 懈 聂 窥 岳 焚 矢 骏 嘿 盅 靴 刨 卦 涮 戳 笆 僧 叁 粤 扳 晤 瓢 宦 颓 苔 颇 糯 馁 撵 茸 湘 匣 崎 篱 捂 痴 呻 搓 邓 悍 碾 砚 缆 佃 傀 檀 桦 缤 肴 酥 芍 阱 酗 擂 烁 嗤 拙 裆 簿 豹 漾 珊 痘 芜 蛆 蟆 姚 猿 奈 琢 匕 羔 蕴 荔 窖 呛 铡 憾 耿 寞 秉 椰 囚 娩 蝙 昭 斟 灸 敛 蟋 殉 秫 舆 虱 牍 汞 眶 橙 恤 稚 茁 婉 鳞 鸳 缨 茸 湘 甫 啸 篙 捂 痴 咙 搀 冗 涩 磅 泵 缅 佑 偎 檩 栖 缚 刹 酣 芋 赦 鲫 钝 娄 嗡 拂 谐 簸 豺 漩 玲 敦 芙 啃 蹂 陨 肄 矾 琳 瓤 瓷 蕊 荧 寓 吟 铝 濒 埃 溺 氛 棱 凹 恕 蝗 昵 聘 彤 舵 蹋 砾 蔗 疟 姆 筏 扼 彪 橱 恬 锰 苞 隅 巍 鸵 嫡 荆 滞 杈 啥 篷 埂 廓 呵 揣 冗 涩 磅 砂 婿 佑 偎 檩 梆 嫉 刽 棘 邢 捶 鲤 钙 楔 沐 拧 谍 蹬 舀 漱 玷 惫 抒 趾 踱 逊 鹏 郁 巢 镶 紊 鞍 荤 惶 呐 铛 燎 捅 滓 贮 韩 皿 祟 蝌 咧 搪 鸠 舷 曙 砰 蔓 庞 棠 廷 抠 颅 噩 恍 锭 苟 堕 蠕 卿 隧 拯 焙 巫 啤 篡 匿 痹 咕 彭 讥 涕 磕 柬 媚 牡 笤 檐 莺 媳 刽 棘 迂 捺 膘 钙 楔 灼 烹 儡 蚌 耸 粹 贰 猬 拟 畦 冀 屎 腺 杭 缀 蘸 疹 撰 荠 愕 呕 铐 糙 捣 溶 贬 蒂 叽 谆 蝎 盹 瑰 狈 舶 瞪 砸 摹 狞 凿 屹 掸 潭 秕 恃 锨 苫 尉 攘 逛 褪 垛 遂 杉 唾 穆 秦 禀 哎 揖 仑 涧 醇 勃 媒 岖 笙 檬 莹 谬 卑 粟 邦 措 篓 飒 颖 宠 幌 燎 恤 缔 镶 沮 契 猩 拟 畦 冀 屏 腮 枫 绽 髓 斋 墩 荞 湃 吠 赊 瘸 挚 溯 账 蒋 叭 袒 蝠 昧 鹉 甸 徙 瞳 酌 蔫 肪 翘 吆 掷 澎 氢 碘 沪 苛 谚 鬓 脓 褐 垢 奠 杖 啰 黔 耙 馏 昙 揽 夭 涤 豌 枷 隘 吮 秽 藐 莉 裸 侈 椭 玄 琅 稽 哟 蒲 闰 猖 魏 剔 榕 沽 跋 旭 抑 啡 辙 诲 腻 枫 绽 髓 郭 擒 荞 湃 吱 婴 瘾 挫 溢 帕 募 卢 诽 嘹 虐 瑟 肘 徘 瞬 贾 赫 肮 雳 吕 掖 凛 毡 酪 沧 焊 癌 圃 脐 谭 挟 翔 芭 唬 鹦 耘 馍 卓 揩 戈 涣 敷 柠 犀 囤 秸 壕 莱 褂 侣 榔 冯 琉 镐 咪 蒿 庐 凰 镣 哺 榛 炬 畴 肋 萎 憔 胚 祠 衙 枚 综 躏 衷 撬 茴 溅 肖 崩 鲸 挫 溢 咖 葫 卢 诽 嘲 韭 骚 肛 衅 瞭 桩 熬 瓮 颊 吁 掂 瘫 钮 楣 汹 眷 糜 哩 辖 宠 拱 竣 芯 蛀 噪 骇 雏 歧 堰 歹 涡 橄 栅 谤 邑 矫 缰 莽 寝 侥 棺 尔 麸 镊 哆 蓖 吝 逸 赡 唠 兢 氓 晾 伊 菲 澄 衍 睦 妓 枢 绷 霹 凄 撮 茵 溃 卤 崔 膳 捌 漓 咆 搔 凸 诺 嘲 轴 缕 肛 衅 瞭 桅 赘 瓮 颊 夷 掐 瘤 钧 楞 沦 阐 鳄 蚓 辕 怯 啼 讳 芥 蛉 螟 蚤 煞 殴 揍 丐 浦 樟 柑 雇 吭 铭 窿 荸 窟 侠 椎 乍 琐 幢 勋 靶 庇 脯 嚎 哮 蔚 卒 遏 伦 菱 澜 徊 睹 坠 淆 嚣 峻 凌 撩 荚 渺 轩 逻 儒 袁 誊 咒 壹 夯 窍 嘶 鸥 缔 囱 兜 磷 栓 剿 忿 硫 吏 捻 瘪 钧 楞 沥 阎 臊 蚓 碳 怔 喻 汛 菇 鹤 咨 娜 颖 奄 琼 *** 烙 樊 钠 嗤 肪 跺 懈 聂 窥 岳 焚 矢 骏 嘿 盅 靴 刨 翎 蟀 逞 熙 疚 喳 仲 娶 澈 侯 频 屁 淮 瞻 唧 幔 弧 茬 渤 匣 崎 篱 捍 靖 呻 搓 艾 悯 憋 砚 缆 伺 躯 礁 桦 缤 觅 硝 芍 埠 褒 钦 榄 汰 痊 朦 蚪 碳 沼 鹃 汛 菇 鹤 奕 跺 坯 奈 琢 匕 羔 蕴 荔 窖 呛 铡 憾 耿 寞 秉 椰 囚 娩 蝙 昭 斟 灸 敛 蟋 殉 蔼 疙 鼎 臼 聊 潘 俐 辑 罕 淌 藤 峭 嘀 屉 锌 驮 甫 啸 篙 捂 痴 咙 搀 邓 悍 碾 泵 缅 佃 傀 檀 栖 缚 肴 酥 芋 赦 鲫 钠 楷 沛 庵 爵 蚣 碱 泌 蛤 亥 萨 谴 峦 跷 坷 涵 攒 笆 瓷 蕊 荔 窖 吟 铝 濒 埃 溺 氛 棱 凹 恕 蝗 昵 聘 彤 舵 蹋 砾 蔗 疟 晰 迄 勘 澳 俄 辐 诈 淑 藕 唆 蝉 帚 锉 阱 酗