c++中如何使用多线程_c++ thread用法实例


std::thread构造后必须detach或join,否则析构时调用std::terminate导致崩溃;传参需注意std::ref和std::move;避免隐式捕获this引发悬空指针;共享数据须用原子操作或互斥锁保护。

std::thread 构造后必须 detach 或 join

创建 std::thread 对象后,如果既没调用 join() 也没调用 detach(),对象析构时会调用 std::terminate(),程序直接崩溃。这是新手最常踩的坑。

  • join():主线程阻塞等待子线程结束,适合需要结果或同步完成的场景
  • detach():子线程后台运行,与主线程脱离关系,但需确保线程内不访问已销毁的局部变量或栈内存
  • 推荐优先用 join(),除非明确需要后台异步且生命周期可控

传参时注意值传递、引用传递和 move 语义

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));

避免在 lambda 中隐式捕获 this 导致悬空指针

成员函数中启动线程并捕获 this(比如 [this]() { ... }),若线程还在运行而对象已被销毁,就会访问非法内存。尤其在类生命周期短于线程时风险极高。

  • 检查对象生命周期是否覆盖线程全程
  • 改用值捕获所需字段([val = this->data])而非整个 this
  • 必要时用 std::shared_ptr 管理对象生命周期,并在线程内持有弱引用或共享引用
  • 调试时可加日志或断点确认对象析构时机是否早于线程退出

线程间共享数据必须加锁或用原子操作

多个线程读写同一变量(如全局 int counter)而未同步,会导致未定义行为——结果随机、崩溃、静默错误。不要依赖“好像没出问题”。

立即学习“C++免费学习笔记(深入)”;

  • 简单计数器优先用 std::atomic_int,性能好且无需锁
  • 复杂逻辑(如修改结构体多个字段)必须用 std::mutex + std::lock_guard
  • 避免死锁:始终按固定顺序获取多个锁;慎用 std::try_lockstd::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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.