std::thread构造后必须detach或join,否则析构时调用std::terminate导致崩溃;传参需注意std::ref和std::move;避免隐式捕获this引发悬空指针;共享数据须用原子操作或互斥锁保护。
创建 std::thread 对象后,如果既没调用 join() 也没调用 detach(),对象析构时会调用 std::terminate(),程序直接崩溃。这是新手最常踩的坑。
join():主线程阻塞等待子线程结束,适合需要结果或同步完成的场景detach():子线程后台运行,与主线程脱离关系,但需确保线程内不访问已销毁的局部变量或栈内存join(),除非明确需要后台异步且生命周期可控std::thread 构造函数会对参数做拷贝(即使原函数形参是引用),所以想传引用必须显式用 std::ref();想转移资源所有权(如 std::unique_ptr)必须用 std::move()。
int x = 42; std::string s = "hello";// 错误:f1 中的 ref_x 实际绑定到 x 的拷贝,不是原始 x std::thread t1([](int& ref_x) { ref_x = 100; }, x);
// 正确:用 std::ref 传递引用 std::thread t2([](int& ref_x) { ref_x = 100; }, std::ref(x));
// 正确:转移 unique_ptr 所有权 std::unique_ptr
ptr = std::make_unique (99 ); std::thread t3([](std::unique_ptr
p) { / 使用 p / }, std::move(ptr));
成员函数中启动线程并捕获 this(比如 [this]() { ... }),若线程还在运行而对象已被销毁,就会访问非法内存。尤其在类生命周期短于线程时风险极高。
[val = this->data])而非整个 this
std::shared_ptr 管理对象生命周期,并在线程内持有弱引用或共享引用多个线程读写同一变量(如全局 int counter)而未同步,会导致未定义行为——结果随机、崩溃、静默错误。不要依赖“好像没出问题”。
立即学习“C++免费学习笔记(深入)”;
std::atomic_int,性能好且无需锁std::mutex + std::lock_guard
std::try_lock 或 std::unique_lock 超时机制std::atomic_int counter{0};
std::mutex mtx;
// 推荐:原子操作
counter.fetch_add(1, std::memory_order_relaxed);
// 必须:临界区加锁
{
std::lock_guard lock(mtx);
// 修改共享数据结构...
}
多线程真正难的不是启动几个 std::thread,而是厘清数据归属、生命周期边界和同步粒度。一个没被 join() 的线程、一次忘记 std::ref 的传参、一段没锁的共享写入,都可能让程序在高负载下才暴露问题。
# 栈
# c++
# red
# 成员函数
# 构造函数
# 局部变量
# 结构体
# int
# Lambda
# 指针
# 线程
# 多线程
# 主线程
# Thread
# 值传递
# 引用传递
# 形参
# 空指针
# 对象
# this
# 异步
# 多个
# 死锁
# 加锁
# 这是
# 几个
# 就会
# 还在
# 隐式
# 也没
# 厘清
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】
使用类变量定义字符串常量时的类型安全最佳实践
php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】
Windows10怎样设置家长控制_Windows10家长控制设置方法【指南】
Python多线程使用规范_线程安全解析【教程】
如何测试您的网站全球打开速度-网站海外测速工
Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】
Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置
php订单日志怎么按状态筛选_php筛选不同状态订单日志教程【教程】
MAC如何修改默认应用程序_MAC文件后缀关联设置与打开方式更改【教程】
Win11触摸板没反应怎么办_开启Win11笔记本触摸板手势教程【步骤】
php转exe用什么工具打包快_高效打包软件推荐【汇总】
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
Windows10电脑怎么连接蓝牙设备_Win10蓝牙配对失败解决方法
Python面向对象实战讲解_类与设计模式深入理解
php查询数据怎么导出csv_查询结果转csv文件保存【操作】
如何用正则表达式精确匹配“start”到“end”之间最多含一个换行符的文本段
Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】
c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
怎么将XML数据可视化 D3.js加载XML
C++如何获取CPU核心数?(std::thread::hardware_concurrency)
Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】
mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】
Windows Defender扫描失败怎么办_安全模块损坏修复方式
C++ STL算法库怎么用?C++常用算法函数(sort, find)教程【效率提升】
Python数据挖掘核心算法实践_聚类分类与特征工程
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度
Python文件管理规范_工程实践说明【指导】
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
如何解决Windows时间不准的问题?(自动同步设置)
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
php8.4xdebug无法调试怎么办_php8.4xdebug配置问题解决【解答】
c++协程和线程的区别 c++异步编程模型对比【核心】
XAMPP 启动失败(Apache 突然停止)的终极排查与修复指南
Python网络超时处理_健壮性设计说明【指导】
Python日志系统设计与实现_高可观测性架构实战
Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】
如何在Golang中配置代码格式化工具_使用gofmt和goimports
windows如何禁用驱动程序强制签名_windows高级启动设置指南
Windows怎样关闭开始菜单广告_Windows关闭开始菜单广告设置【步骤】
Windows 10自带杀毒软件在哪_Windows 10打开和使用Windows安全中心
如何诊断并终止卡死的 multiprocessing 子进程
Win10怎样卸载DockerDesktop_Win10卸载DockerDesktop步骤【步骤】
如何用正则表达式精确匹配最多含一个换行符的起止片段
Windows服务持续崩溃怎样修复_系统服务保护机制解析
2026-01-05
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。