当前位置: 首页 > news >正文

C++ 中 std::thread 的高级应用

C++ 中 std::thread 的高级应用、常见坑,以及如何封装为类,适合做线程池、异步任务、后台 worker、并发调度等场景。内容结构如下:


一、std::thread 高级用法清单

1. 线程成员函数调用(this 捕获)

class Worker {
public:void run() {std::thread t(&Worker::doWork, this); // 必须传 this 指针t.detach();}void doWork() {std::cout << "Running in thread: " << std::this_thread::get_id() << std::endl;}
};

2. 使用 Lambda 或函数对象启动线程

std::thread t([] {std::cout << "Lambda in thread\n";
});
t.join();

二、注意事项 & 常见坑

⚠️ 问题原因
std::terminate() 崩溃线程创建后未 join 或 detach
传引用未用 std::ref参数拷贝错误或未生效
多线程访问共享变量没加锁或未使用原子操作
类内线程管理失控析构时线程未清理,资源泄漏或崩溃

三、封装线程为类成员的完整模板

#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>class ThreadWorker {
public:ThreadWorker() : m_running(false) {}~ThreadWorker() {stop(); // 析构时停止线程}void start() {m_running = true;m_thread = std::thread(&ThreadWorker::threadFunc, this);}void stop() {if (m_running) {m_running = false;if (m_thread.joinable()) {m_thread.join();}}}private:void threadFunc() {while (m_running) {std::cout << "[Thread] Working... " << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(500));}std::cout << "[Thread] Exiting." << std::endl;}std::thread m_thread;std::atomic<bool> m_running;
};

使用方法:

int main() {ThreadWorker worker;worker.start();std::this_thread::sleep_for(std::chrono::seconds(2));worker.stop();
}

四、进阶封装建议(适合线程池设计)

1. 使用 std::function<void()> 注册任意任务

std::function<void()> task = [] { std::cout << "Job\n"; };

2. 使用 std::queue + mutex + condition_variable 管理任务队列


五、其他高级工具组合推荐

工具用途
std::future, std::promise任务结果异步获取
std::packaged_task把函数打包为可异步执行任务
std::atomic原子变量,轻量线程同步
condition_variable多线程通信唤醒机制

总结建议

  • ✅ 线程内部用 std::atomic<bool> 控制退出比 bool 更安全
  • ✅ 类内线程要在析构时妥善停止并 join
  • ✅ 避免裸线程泄露:用类、封装、RAII 管理生命周期
  • ✅ 封装成线程池/任务队列是多线程项目的基础
http://www.xdnf.cn/news/103105.html

相关文章:

  • [实战]zynq7000设备树自动导出GPIO
  • 基于 Spring Boot 瑞吉外卖系统开发(六)
  • ElasticSearch深入解析(三):Elasticsearch 7的安装与配置、Kibana安装
  • spark和Hadoop之间的对比与联系
  • 确保电力作业安全:安全工器具的检查与使用指南
  • 比较:AWS VPC peering与 AWS Transit Gateway
  • 云原生后端架构:重塑后端开发的新范式
  • Linux服务器:在ufw防火墙设置这套规则sudo ufw allow from 172.0.0.0/8,为什么容器就可以访问宿主机的服务了?
  • ReAct Agent 实战:基于DeepSeek从0到1实现大模型Agent的探索模式
  • leetcode-哈希表
  • 容器修仙传 我的灵根是Pod 第8章 护山大阵(DaemonSet)
  • React-实现切换tab高亮显示和排序
  • 【Python爬虫详解】第四篇:使用解析库提取网页数据——BeautifuSoup
  • 240423 leetcode exercises
  • 【Java】HQL查询初步
  • AI健康小屋:解锁健康管理新密码
  • node.js 实战——(概念以及Buffer 知识点学习)
  • AndroidAutomotive模块介绍(四)VehicleHal介绍
  • Minio Linux 安装 systemctl启动配置
  • “信号魔方”大扭转RS232 瞬变 PROFINET 激活交通脉络
  • 文件属性隐写
  • else if 在 C 语言中的使用
  • OJ笔试强训_25至48天_每天三道OJ
  • Vscode已经打开的python项目,如何使用已经建立的虚拟环境
  • TFTP服务调试
  • 网络原理初始
  • opencv--图像滤波
  • OpenCV 图形API(54)颜色空间转换-----将图像从 RGB 色彩空间转换到 HSV色彩空间RGB2HSV()
  • PubLayNet:文档布局分析领域的大规模数据集
  • 科技项目必须进行验收测试吗?项目验收测试服务机构有哪些?