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

C++多线程运行整理

一.多线程运行

#include <iostream>
#include <thread>void print_id(int id)
{std::cout << "ID:" << id <<  ",线程ID为:" << std::this_thread::get_id() <<std::endl;
}
int main(void)
{   std::thread t1(print_id,1);t1.join();std::thread t2(print_id,2);t2.join();return 0;
}

二.多线程并发的实现方式

1.使用函数指针

// 多线程并发1_使用函数指针
// 使用多线程的库,来实现并行计算的加法#include <iostream>   
#include <thread>int sum = 0;
float avg = 0;
void add(int a,int b)
{sum += a + b;
}void Avg(int a,int b)
{avg = (a + b)/2;
}int main()
{int a = 5;int b = 10;std::thread t1(add,a,b);t1.join();std::cout << "线程1和为:" << sum <<std::endl;std::thread t2(add,a,b);t2.join();std::cout << "线程2和为:" << sum <<std::endl;std::thread t3(Avg,a,b);t3.join();std::cout << "线程3平均为:" << avg <<std::endl;return 0;
}
全局变量无锁保护多线程共享变量,有数据竞争风险使用 std::mutex
std::thread 无法返回值不能直接获取线程函数的返回值改用 std::async + std::future

2.使用函数对象

// 多线程并发2_使用函数对象
// 通过类中的 operator() 方法定义函数对象来创建线程#include <iostream>   
#include <thread>class PrintTask
{
public:void operator()(int count) const{for (int i = 0;i < count;++i){std::cout << "第" << i+1 << "次使用函数对象(function object)创建多线程!\n";}}
};int main (){std::thread t2(PrintTask(),5);//创建线程,传递函数对象和参数t2.join(); //等待线程完成return 0;
}

3.使用Lambda表达式

// 多线程并发3_使用Lambda表达式
// 使用Lambda表达式可以直接内联定义线程执行的代码#include <iostream>   
#include <thread>
int main(){std::thread t3([](int count){for (int i = 0;i < count; ++i){std::cout << "第" << i+1 << "次使用Lambda表达式执行线程!\n" ;}},5);//创建线程,传递Lambda表达式和参数t3.join();//等待线程完成return 0;
}

三.整合3种多线程并发创建方式融合展示

/*
将函数指针,函数对象和Lambda表达式 3种方式创建线程进行融合展示
*/#include <iostream>
#include <thread>
using namespace std;//一个简单的函数,作为线程的入口函数
void foo(int Z){for (int i = 0;i < Z;i++){cout << "线程使用函数指针作为可调用参数\n";}
}//可调用对象的类定义
class ThreadObj{public:void operator()(int x) const{for (int i = 0;i < x;i++){cout << "线程使用函数对象作为可调用参数\n";}}
};int main(){cout << "线程1,2,3独立运行" << endl;//使用函数指针创建线程thread th1(foo,3);//使用函数对象创建线程thread th2(ThreadObj(),3);//使用Lambda表达式创建线程thread th3([] (int x){for (int i = 0;i < x;i++){cout << "线程使用Lambda表达式作为可调用参数\n";}},3);//等待所有线程完成th1.join(); //等待线程th1完成th2.join(); //等待线程th2完成th3.join(); //等待线程th3完成return 0;
}

整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!

http://www.dtcms.com/a/552940.html

相关文章:

  • 【渲染引擎基础】圣杯架构——固定逻辑时长+插值渲染
  • iOS 崩溃日志分析工具全指南,多工具协同构建稳定性分析体系
  • 做网站推广的难点、襄阳地区网站做的好的
  • 从U-Net到U-Net++:图像分割网络的进阶之路
  • 打工人日报#20251031
  • Huggingface的国内镜像
  • 软件测试工程师面试准备
  • Applications Manager 仪表盘:新增功能亮点
  • 怎样做网站表白网站策划与建设阶段的推广
  • 持续更新|第12弹:基于yolo算法识别的物体抓取
  • 使用Requests和正则表达式实现京东投影仪商品数据爬取
  • rabbitmq-k8s下双架构镜像+手动sts部署完全文档(下)
  • 仿RabbitMQ实现消息队列(二)-安装
  • 三网合一营销型全网站wordpress的功能简介
  • 鸿蒙分布式数据服务(DDS)原理与企业同步实战
  • 《pygame中Sprite类实现多帧动画》注-显示静态图片2-2
  • 2025年10月31日Github流行趋势
  • 深入浅出wpf学习总结
  • 建搜索引擎网站做欧洲电商看哪个网站
  • 【Linux网络】实现一个简单的聊天室
  • HTTPS接口国密安全设计-示例
  • 通过nginx+openssl自签名证书部署https应用并解决不安全问题
  • AI提示词:别再把提示词当 “聊天”—— 它是人机协作的 “接口定义”
  • Rust开发之使用panic!处理不可恢复错误
  • 买业务送网站浙江省住房和城乡建设厅网站查询
  • 网站托管服务 优帮云网站专题页面用什么做
  • Redisson 的分布式锁机制幽默笑话理解
  • Qt-HTTPWebSocket
  • MATLABcode|2个雷达二维目标跟踪滤波系统 - EKF实现,匀速运动模型,输入:雷达观测数据(距离、方位角),输出:目标状态估计(位置、速度)
  • TDengine 数据函数 CORR 用户手册