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

C++ 多线程基础

C++ 多线程基础

概述

线程(Thread)

  • 线程是程序执行中的单一顺序控制流,多个线程可以在同一个进程中独立运行
  • 线程共享进程的地址空间、文件描述符、堆和全局变量等资源,但每个线程有自己的栈、寄存器和程序计数器

并发(Concurrency)与并行(Parallelism)

  • 并发:多个任务在时间片段内交替执行,表现出同时进行的效果。
  • 并行:多个任务在多个处理器或处理器核上同时执行

C++11标准引入了原生的多线程支持,通过头文件提供了跨平台的多线程API。核心组件包括:

  • std::thread:用于创建线程和管理线程
  • std::mutex:用于线程之间的互斥,防止多个线程同时访问共享资源。
  • std::lock_guardstd::unique_lock:用于管理锁的获取和释放。
  • std::futurestd::promise:用于实现线程间的值传递和任务同步

创建线程

通过std::thread来创建线程

std::thread thread_obj(callable, args...)
  • callable: 可调用对象,可以是函数指针、函数对象、Lambda表达式等。
  • args...: 传递给callable的参数列表

使用函数指针

通过函数指针创建线程,这是最基本的方式:

#include <iostream>
#include <thread>// 基本线程函数
void thread_func(int id) {std::cout << "线程" << id << " 正在运行" << std::endl;
}int main() {// 创建线程std::thread t1(thread_func, 1);  // 创建线程,传递函数指针和参数std::thread t2(thread_func, 2);t1.join(); // 等待线程完成t2.join(); // 等待线程完成return 0;
}

运行结果:
image

两个现场同时执行 导致控制台打印错乱

使用函数对象

通过类中的operator()方法定义函数对象来创建线程:

#include <iostream>
#include <thread>class PrintTask {
public:void operator()(int count) const {for (int i = 0; i < count; ++i) {std::cout << "Hello from thread (function object)!\n";}}
};int main() {std::thread t2(PrintTask(), 5); // 创建线程,传递函数对象和参数t2.join(); // 等待线程完成return 0;
}

使用Lambda表达式

Lambda表达式可以直接内联定义线程执行的代码:

#include <iostream>
#include <thread>
int main() {// 使用lambda表达式创建线程std::thread t3([](int num) {std::cout << "Lambda线程" << num << " 正在运行" << std::endl;}, 3); // 创建线程,传递 Lambda 表达式和参数t3.join();// 等待线程完成return 0;
}

线程管理

join()

join()用于等待线程完成执行。如果不调用join()detach()而直接销毁线程对象,会导致程序崩溃。

t.join();

detach()

detach()将线程与主线程分离,线程在后台独立运行,主线程不再等待它。

t.detach();

线程的传参

值传递

参数可以通过值传递给线程:

std::thread t(func, arg1, arg2);

引用传递

如果需要传递引用参数, 需要使用std::ref:

#include <iostream>
#include <thread>void increment(int& x) {++x;
}int main() {int num = 0;std::thread t(increment, std::ref(num)); // 使用 std::ref 传递引用t.join();std::cout << "Value after increment: " << num << std::endl;return 0;
}
http://www.rkmt.cn/news/142431.html

相关文章:

  • 从环境搭建到模型调优:Open-AutoGLM本地部署7大核心步骤(附代码)
  • 2025-2026 中国 10 大权威工业类论坛全景盘点:仪器、机械、工控、电子领域全覆盖 - 品牌推荐大师1
  • 终于有人把知识图谱+LLM融合讲明白了!
  • 【大模型自动化新利器】:Open-AutoGLM的3种高阶用法你必须掌握
  • 河南清洗油选道骐科技!30年民族品牌,品质标杆之选 - 朴素的承诺
  • 医考党必藏!全国前十医师资格证培训机构大盘点,高性价比之选先码住 - 品牌测评鉴赏家
  • 2025区块链革命:当乐高式公链遇见AI预言机,三大行业已被颠覆
  • 2025年底,从被裁员到涨薪转行到AI圈,我是怎么做到的?非常详细收藏这一篇就够了
  • 2025年广州工厂搬家公司权威推荐榜单:个人搬家/仪器设备搬家/长途异地搬家公司精选 - 品牌推荐官
  • 2025年12月平板硫化机,抽真空平板硫化机,液体硅胶挤出机厂家推荐:行业测评与选择指南 - 品牌鉴赏师
  • AI大模型转折点:从零基础到AI产品经理的完整攻略,非常详细收藏我这一篇就够了
  • 增强航空领域的防火保护:氧化锆氧气传感器在燃油箱惰化系统OBIGGS中的作用
  • 2025年12月西安成人烂牙拔牙口腔,西安嵌体补牙口腔,西安种植牙口腔医院推荐:行业测评与选择指南 - 品牌鉴赏师
  • 2025头部 AI 优化公司推荐:谁能帮企业抢占智能搜索流量高地? - 呼呼拉呼
  • Open-AutoGLM到底强在哪?对比传统架构的4个压倒性优势
  • 计算机Java毕设实战-基于SpringBoot的农产品溯源系统Springboot农产品全供应链可信溯源平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 技术日报|家庭AI集群exo爆火登顶日增1320星,Anthropic发布Agent技能库
  • 如何在国产操作系统上使用 Qt 进行硬件调用?
  • 巧用AI挖掘创新点!从三个层面借助AI寻找矛盾、争议、分歧,让你的论文研究价值瞬间拉满(附AI提示词)
  • 2025年膜结构雨棚实力厂家推荐:膜结构景观棚/车棚膜结构/膜结构遮阳棚一站式服务优选 - 品牌推荐官
  • 【重要通知】PcVue-重要通知
  • 【计算机毕业设计案例】基于SpringBoot的农产品溯源系统基于SpringBoot + Vue的农产品溯源系统(程序+文档+讲解+定制)
  • Java计算机毕设之基于SpringBoot+vue的学生就业信息管理系统基于springboot的就业推荐系统(完整前后端代码+说明文档+LW,调试定制等)
  • Open-AutoGLM如何在手机端高效运行?揭秘轻量化部署的3个关键技术突破
  • 启点创新景区灯会旅游票务系统,景区灯会售检票管理系统,智慧景区票务管理系统推荐
  • 领跑行业!深圳这些水表工厂凭什么成为智能水务“领航者”?
  • 【Open-AutoGLM开源实战指南】:手把手教你快速部署与高效应用
  • Java毕设项目推荐-基于SpringBoot的农产品信息溯源系统基于SpringBoot的农产品溯源系统【附源码+文档,调试定制服务】
  • Open-AutoGLM沉思MCP落地难题全解析,90%团队忽略的3个致命陷阱
  • 基于节日社会工程的Storm-0900钓鱼攻击机制与防御策略研究