一、引言
随着多核 CPU 的普及,程序对并行性能的需求日益增强。C++11 标准正式引入了原生线程库,使得 C++ 并发编程变得更标准、更可靠。
本篇文章将从零开始,逐步讲解如何在 C++ 中使用线程和同步机制来实现安全高效的并发程序。
二、线程的基本使用(std::thread)
1. 创建线程
cpp复制编辑#include <iostream>
#include <thread>
void hello() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(hello);
t.join(); // 等待线程执行结束
}
输出:
cpp复制编辑Hello from thread!
2. join vs detach
-
join():主线程等待子线程完成; -
detach():子线程脱离,主线程不会等待。cpp复制编辑t.detach(); // 后台执行,不可再 join
三、传递参数给线程
1. 值传递
cpp复制编辑void print_num(int x) {
std::cout << "Number: " << x << "\n";
}
std::thread t(print_num, 42);
2. 引用传递
cpp复制编辑void print_ref(int& x) {
x += 10;
}
int a = 5;
std::thread t(print_ref, std::ref(a));
四、线程安全问题与互斥锁(std::mutex)
1. 非线程安全示例
cpp复制编辑int counter = 0;
void increase() {
for (int i = 0; i < 100000; ++i)
++counter;
}
多个线程同时执行将引起数据竞争,结果不可预期。
2. 使用互斥锁
cpp复制编辑#include <mutex>
std::mutex mtx;
void safe_increase() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard<std::mutex> lock(mtx);
++counter;
}
}
图示:锁粒度控制
pgsql复制编辑Thread A: lock → update → unlock
Thread B: wait → lock → update
五、std::lock_guard 与 std::unique_lock
1. lock_guard 简洁封装
cpp复制编辑std::lock_guard<std::mutex> lock(mtx);
// 自动加锁和解锁
2. unique_lock 灵活控制
cpp复制编辑std::unique_lock<std::mutex> lock(mtx);
lock.unlock(); // 手动释放锁
lock.lock(); // 重新加锁
六、条件变量(std::condition_variable)
用于线程间通信,常用于生产者消费者模型。
1. 示例:等待某个条件
cpp复制编辑std::condition_variable cv;
std::mutex mtx;
bool ready = false;
void worker() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return ready; });
std::cout << "Thread is running\n";
}
void notifier() {
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // 唤醒一个等待线程
}
七、std::future 与 std::async
1. 异步任务执行
cpp复制编辑#include <future>
int compute() {
return 10 + 20;
}
std::future<int> fut = std::async(compute);
std::cout << fut.get(); // 阻塞直到任务完成
-
get():获取返回值; -
wait():等待完成但不取值。
八、并发容器简析(C++17 之前)
标准库未提供内建线程安全容器,常见做法:
1. 封装线程安全队列
cpp复制编辑template<typename T>
class ThreadSafeQueue {
std::queue<T> q;
std::mutex mtx;
public:
void push(const T& val) {
std::lock_guard<std::mutex> lock(mtx);
q.push(val);
}
bool pop(T& val) {
std::lock_guard<std::mutex> lock(mtx);
if (q.empty()) return false;
val = q.front();
q.pop();
return true;
}
};
九、实战案例:多线程日志系统
1. 日志类定义
cpp复制编辑class Logger {
std::mutex mtx;
std::ofstream logfile;
public:
Logger(const std::string& filename) {
logfile.open(filename);
}
void log(const std::string& msg) {
std::lock_guard<std::mutex> lock(mtx);
logfile << msg << std::endl;
}
};
2. 多线程写日志
cpp复制编辑Logger logger("log.txt");
void worker(int id) {
for (int i = 0; i < 100; ++i) {
logger.log("Thread " + std::to_string(id) + " log " + std::to_string(i));
}
}
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join(); t2.join();
保证了线程安全的文件写入。
十、线程池简述(高级话题预览)
C++ 标准库未直接提供线程池,但可以自定义:
cpp复制编辑// 示例略,推荐使用 C++20 或第三方库如 Boost::asio、Intel TBB、ThreadPool++
十一、并发编程中的常见陷阱
问题类型
描述
数据竞争
多线程同时读写同一变量未加锁
死锁
多个线程等待彼此释放资源
活锁
不断尝试但无法推进
虚假唤醒
条件变量唤醒时应配合 while (!cond) 判断
锁粒度过细/过粗
会影响性能或造成资源冲突
十二、C++20 中的新并发特性(简要预览)
-
std::jthread:自动 join 的线程封装; -
std::stop_token:线程取消支持; -
std::barrier、std::latch:新同步原语; -
更强的编译期线程安全检查。
十三、总结与推荐实践
✅ 推荐做法:
-
优先使用
std::thread+mutex+lock_guard; -
用
std::condition_variable实现线程协调; -
用
std::async替代部分异步手工线程管理; -
自定义线程安全容器用于共享数据结构。
🚫 不推荐做法:
-
裸使用
pthread(除非跨平台需求); -
所有操作都加锁(影响性能);
-
忽略异常与线程同步带来的边界问题。
十四、结语
C++ 的并发编程虽不如某些语言语法上简洁,但凭借其对性能和控制的绝对把握,仍是系统软件、高性能计算、游戏引擎和金融核心系统的首选语言之一。掌握现代 C++ 的并发工具,将使你在多核时代的开发中游刃有余。
来源:联网跳转
来源:阅读指令
来源:追踪链接
来源:深度链接
来源:阅读页面
来源:外链出自
来源:资料指南
来源:路径链接
来源:入口信息
来源:建议阅读
来源:实际引用
来源:外部入口
来源:阅读快线
来源:页面地址
来源:专业出处
来源:相关资源
来源:网页跳转口
来源:引导路径
来源:来源文档
来源:内容延展
来源:快速入口
来源:了解路径
来源:传送门
来源:详情输入
来源:转跳信息
来源:入口资料
来源:查阅连接
来源:支持出处
来源:深度出处
来源:内容通道
来源:地址传送
来源:页面查看
来源:权威指向
来源:教程出处
来源:精选内容
来源:网页引导
来源:网页原始
来源:平台跳转
来源:网页资源
来源:信息连接
来源:原始下载
来源:资料端口
来源:来源查阅
来源:内容窗口
来源:原文导航
来源:专栏参考
来源:链接地址
来源:信息链接
来源:浏览通道
来源:原始说明链接
来源:外链展示
来源:页面详情
来源:核心来源
来源:内容支持源
来源:指南页
来源:原页资料
来源:深入页面
来源:获取资料
来源:源头链接
来源:栏目内容
来源:进入页面
来源:访问信息
来源:参阅链接
来源:链接引导
来源:全文入口
来源:进入内容页
来源:跳转通道
来源:查阅平台
来源:内容访问
来源:网络入口
来源:页面支撑
来源:推荐查阅
来源:内容页面
来源:外部访问
来源:进入链接页
来源:上游引用
来源:信息导航
来源:文献访问
来源:链接按钮
来源:访问原网页
来源:访问入口
来源:外链原文
来源:页面资源
来源:平台资源
来源:深层资源
来源:资源地址
来源:扩展链接入口
来源:浏览更多内容
来源:推荐通道
来源:可查文献
来源:入口查看
来源:相关补充
来源:数据入口
来源:外链跳转
来源:链接快速通道
来源:查阅原数据
来源:跳转按钮
来源:信息通道
来源:外链页
来源:文章参考链接
来源:页内内容
来源:链接地址参考
来源:推荐信息链接
来源:学术内容入口
来源:原数据链接
来源:内容跳转入口
来源:参考页码
来源:链接文档页
来源:学术查阅页
来源:链接路径参考
来源:外链源页
来源:页面源数据
来源:推荐资源页
来源:网页延伸
来源:详细跳转
来源:官方信息页
来源:内容导向
来源:跳转数据页
来源:信息参考页
来源:内容传送
来源:外链目标页
来源:链接访问页
来源:指向内容页
来源:官方支持页
来源:页面说明来源
来源:访问资源页
来源:延展查阅入口
来源:入口导航页
来源:扩展网页链接
来源:内容资料页
来源:推荐内容页
来源:页面快速跳转
来源:官方页面入口
来源:链接来源页
来源:更多详情
来源:更多参考内容
来源:详细访问链接
来源:页内原文链接
来源:核心阅读链接
来源:快速导航入口
来源:页面跳转入口
来源:研究详情页
来源:查阅详细内容
来源:权威跳转入口
来源:官方参考路径
来源:页面入口说明
来源:内容列表入口
来源:引导页面链接
来源:实用资源页面
来源:数据说明页面
来源:源数据查看
来源:学术路径指引
来源:推荐查阅路径
来源:内容支持页面
来源:指向入口资源
来源:延伸路径指引
来源:详细阅读页
来源:外链访问入口
来源:来源资料页面
来源:内容详情传送
来源:入口链接说明
来源:链接说明页
来源:官方推荐路径
来源:路径延伸阅读
来源:查阅文档页
来源:引导内容入口
来源:核心入口链接
来源:内容补充页面
来源:查阅支持页
来源:跳转详细信息
来源:文献路径引导
来源:信息阅读页面
来源:查看内容页
来源:链接传送入口
来源:外部参考页
来源:相关参考页
来源:文档查看入口
来源:阅读原始页面
来源:页面资源入口
来源:内容平台页
来源:跳转入口页
来源:推荐入口页
来源:来源文献页
来源:官方入口链接
来源:指引查阅路径
来源:页内链接展示
来源:内容平台入口
来源:查阅资源页
来源:链接跳转指引
来源:页面地址入口
来源:权威查阅页面
来源:页面内容参考
来源:原始文献页
来源:深度内容入口
来源:数据资料页面
来源:原始资源页
来源:页面补充信息
来源:实际网页地址
来源:学术查阅入口
来源:平台信息入口
来源:原始信息路径
来源:页面参考来源
来源:实际链接地址
来源:链接入口参考
来源:参考文档页面
来源:外链说明入口
来源:链接直达
来源:深入查证
来源:原文详解
来源:相关页面
来源:来源路径
来源:页面跳出
来源:数据外链
来源:引导阅读
来源:深入来源
来源:原文入口
来源:实际地址
来源:原出处链接
来源:内容源头
来源:查阅通道
来源:额外信息
来源:资料端点
来源:推荐页码
来源:引用文献
来源:内容查询
来源:实时查阅
来源:官方通道
来源:直达资源
来源:导航链接
来源:延伸访问
来源:参考点击
来源:页面查阅
来源:数据访问
来源:平台原始
来源:快速查看
来源:内容接入
来源:跳转查看
来源:页面通道
来源:可用页面
来源:点击参考
来源:文章外链
来源:内容路由
来源:来源查找
来源:路径指引
来源:全部内容
来源:出处文献
来源:文章路径
来源:外链调用
来源:站外链接
来源:路径浏览
来源:外部文献
来源:链接指南
来源:链接点击入口
来源:深入文档
来源:出处路径
来源:学术页面
来源:说明路径
来源:页面文献
来源:网络文档
来源:文档查看页
来源:跳转参考
来源:页面导航链接
来源:关联链接
来源:查看文章
来源:引导说明
来源:数据页入口
来源:原始文档跳转
来源:链接浏览入口
来源:来源阅读页
来源:内容引导页
来源:推荐跳转
来源:可查页面
来源:官方引导
来源:跳转原数据
来源:可跳转文档
来源:平台入口页
来源:网站原始链接
来源:核心信息页
来源:原始站点
来源:延展入口
来源:页面外链
来源:内容展开
来源:更多内容查阅
来源:实际链接入口
来源:文章出处路径
来源:内容传导
来源:快速定位
来源:跳转入口链接
来源:页面入口跳转
来源:内容原始页
来源:文献来源页
来源:外链网页
来源:相关跳转链接
来源:文章链接地址
来源:阅读原页
来源:来源详细信息
来源:官方文档页
来源:页面说明链接
来源:深度查阅链接
来源:页面跳转信息
来源:文档信息源
来源:链接信息入口
来源:网页引导路径
来源:页面导向链接
来源:查阅起点
来源:网页资源链接
来源:指向阅读页
来源:快捷阅读
来源:外部链接跳转
来源:页面访问点
来源:官方链接源
来源:查阅推荐页
来源:路径地址查看
来源:跳转资源入口
来源:查看详细页
来源:跳转信息链接
来源:平台说明页
来源:外部页面访问
来源:阅读页地址
来源:链接页入口
来源:查阅内容来源
来源:内容详细页
来源:原始链接入口
来源:页面内容源
来源:查阅网页链接
来源:可读内容页
来源:文章说明链接
来源:内容浏览器入口
来源:外链浏览页
来源:网页推荐链接
来源:指向页面地址
来源:链接页面详情
来源:页面查阅通道
来源:查阅信息源
来源:平台内容跳转
来源:页面说明文本
来源:可阅读原文
来源:页面指引链接
来源:跳转外链入口
来源:数据推荐页
来源:文章引导页
来源:网页说明内容
来源:浏览内容入口
来源:内容出处导航
来源:信息原文页
来源:页面信息资源
来源:文档源头路径
来源:文章原页跳转
来源:网页地址链接
来源:页面参考资源
来源:内容跳出页
来源:链接定位路径
来源:查阅内容平台
来源:引导参考页面
来源:页面资源查询
来源:内容导览页
来源:链接内容地址
来源:页面导向信息
来源:内容站外入口
来源:阅读文章页
来源:页面平台入口
来源:外链跳转通道
来源:页面参考入口
来源:入口跳转页
来源:引导文献页
来源:数据查阅页
来源:页面通道入口
来源:可跳转平台
来源:实时外链路径
来源:链接外部资源
来源:页面起始链接
来源:参考网页内容
来源:网页内容跳转
来源:文章延伸页
来源:内容查找入口
来源:引导跳转信息
来源:跳转资源页
来源:站外资源查看
来源:资料原始链接
来源:文献通道入口
来源:推荐访问链接
来源:文章外跳入口
来源:页面数据通道
来源:可跳转信息页
来源:路径入口说明
来源:页面源文档
来源:数据延伸链接
来源:页面原路径
来源:引用说明入口
来源:跳转路径源
来源:页面说明内容
来源:页面通行地址
来源:数据查阅地址
来源:可参考原页
来源:页面说明文章
来源:内容路径推荐
来源:跳转资源页面
来源:引导页面信息
来源:页面参考导向
来源:入口跳转说明
来源:文档浏览地址
来源:页面跳转说明
来源:页面内容详情
来源:内容外部路径
来源:网页原文说明
来源:内容查找页
来源:平台外链资源
来源:文献平台入口
来源:路径导航链接
来源:页面跳出内容
来源:外链导向页
来源:网页导航资源
来源:原始资料页面
来源:信息页面链接
来源:内容导向路径
来源:页面指引地址
来源:路径查看入口
来源:内容查阅地址
来源:页面推荐资源
来源:网页地址跳转
来源:原始入口说明
来源:路径说明页面
来源:入口信息地址
来源:页面通道资源
来源:可跳转文献
来源:实用页面链接
来源:页面内容引导
来源:页面引导跳转
来源:跳转页面推荐
来源:参考链接导航
来源:页面外链内容
来源:可阅读内容页
来源:页面推荐信息
来源:页面延伸内容
来源:内容站外链接
来源:页面站外跳转
来源:页面参考信息
来源:页面外跳路径
来源:文档跳转说明
来源:网页推荐跳转
来源:原始资料路径
来源:内容路径跳转
来源:页面内容通道
来源:路径内容浏览
来源:页面内容起点
来源:页面说明路径
来源:文章平台入口
来源:页面数据查阅
来源:页面数据来源
来源:文档通道
来源:路径文章
来源:了解详情页
来源:访问详情
来源:资料跳转页
来源:了解入口
来源:资源数据
来源:链接原文
来源:访问原文
来源:原始通道
来源:内容地址
来源:页面内容
来源:引用资料
来源:阅读路径
来源:跳转入口
来源:说明平台
来源:原文页面
来源:数据说明
来源:内容入口
来源:资料源头
来源:平台通道
来源:路径平台
来源:信息源头
来源:页面导向
来源:说明页面
来源:原文内容
来源:跳转内容
来源:地址详情
来源:资源详情
来源:入口参考
来源:浏览页面
来源:源地址页
来源:页面参考
来源:引导详情
来源:资料平台
来源:内容原始
来源:引用路径
来源:阅读详情
来源:入口路径
来源:通道信息
来源:说明资源
来源:地址内容
来源:引导入口
来源:链接资料