当前位置: 首页 > 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.jsqmd.com/news/129808/

相关文章:

  • Java毕设项目:基于SpringBoot的网球馆管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 数字孪生技术驱动现代水利智能创新建设
  • 从环境搭建到模型调优:Open-AutoGLM本地部署7大核心步骤(附代码)
  • 2025年中国AI优化公司推荐:多品牌技术实力评估 - 呼呼拉呼
  • pxcharts 多维表格开源!一款专为开发者和数据分析师打造的轻量化智能表格
  • 28岁大专学历转行网安,过来人的8条避坑指南,让你少走3年弯路!
  • 实用指南:JMeter XPath提取器用法详解:XML/HTML响应数据提取神器
  • 河南防锈油标杆品牌:道骐科技30年守护工业金属安全 - 朴素的承诺
  • 2025-2026 中国 10 大权威工业类论坛全景盘点:仪器、机械、工控、电子领域全覆盖 - 品牌推荐大师1
  • 2025年南京有名的空调机组批发厂家排行榜单,表冷器/新风机组/空调机组/翅片管/工业暖风机/散热器/空气幕/冷却器空调机组生产厂家哪个好 - 品牌推荐师
  • (98页PPT)集团人力资源数字化转型顶层设计方案(附下载方式)
  • 终于有人把知识图谱+LLM融合讲明白了!
  • 户外无电无网视频汇聚平台EasyCVR太阳能4G视频监控解决方案
  • Open-AutoGLM入门到精通(从零构建AI自动化系统)
  • 你的DApp还在交“智商税”?Layer2降费3招省下90%成本!
  • 【大模型自动化新利器】:Open-AutoGLM的3种高阶用法你必须掌握
  • 河南清洗油选道骐科技!30年民族品牌,品质标杆之选 - 朴素的承诺
  • AI Agent如何从Demo走向生产级落地?
  • 实用指南:给SQL server数据库表字段添加注释SQL,附修改、删除注释SQL及演示
  • 2025年底,从被裁员到涨薪转行到AI圈,我是怎么做到的?非常详细收藏这一篇就够了
  • 医考党必藏!全国前十医师资格证培训机构大盘点,高性价比之选先码住 - 品牌测评鉴赏家
  • 2025年广州工厂搬家公司权威推荐榜单:个人搬家/仪器设备搬家/长途异地搬家公司精选 - 品牌推荐官
  • 2025区块链革命:当乐高式公链遇见AI预言机,三大行业已被颠覆
  • 红色担当30载 道骐河南淬火油领跑工业润滑 (1) - 朴素的承诺
  • 2025年12月平板硫化机,抽真空平板硫化机,液体硅胶挤出机厂家推荐:行业测评与选择指南 - 品牌鉴赏师
  • 增强航空领域的防火保护:氧化锆氧气传感器在燃油箱惰化系统OBIGGS中的作用
  • AI大模型转折点:从零基础到AI产品经理的完整攻略,非常详细收藏我这一篇就够了
  • 河南切削液优选道骐科技 30年民族品牌硬核守护工业生产 - 朴素的承诺
  • 选产品,更是选伙伴:供应商的“隐形实力”不容忽视
  • 【毕业设计】基于SpringBoot的农产品溯源系统(源码+文档+远程调试,全bao定制等)