C++ thread的方式

news/2025/1/11 20:51:15/

多线程的实现方式,只做记录,自己看。

目录

  • 第一种 在类中实现多线程
  • 第二种 在类外
  • 第三种 没有类
  • 第四种 pthread,定时触发
  • 总结
  • 附录

第一种 在类中实现多线程

新建thread对象,传入类的成员函数名称,对象地址,以及成员函数需要的参数。

在类的成员函数中,要实现多线程void Perception::test(){.....thread th( &Perception::showImage, this);  //实例化一个线程对象th,使用函数t构造,然后该线程就开始执行了( &Perception::showImage).....}void Perception::showImage();如果showImage()要传参数,就在this后面加上。

第二种 在类外

在主函数中,

void main()
{A a;thread th(&A::test,&a);// 如果要传参数,就在&a后面加上。
}

第三种 没有类

void func()
{.....
}
void main()
{A a;thread th(func);// 如果要传参数,就在&a后面加上。
}

第四种 pthread,定时触发

使用定时器触发,传入多个参数。
定时器实现是在回调函数中的:

 		double process_time = double(clock() - time_start) / CLOCKS_PER_SEC * 100;// ROS_ERROR_STREAM(" process_time......"<< process_time);pthread_testcancel();struct timeval tempval;tempval.tv_sec = 0;tempval.tv_usec = 100000; // 10hzselect(0, NULL, NULL, NULL, &tempval);

其中,多个参数的定义在TIMECALL(结构体),先对结构体成员进行实例化、赋值,然后在将timecall(取地址)传入。

    TIMECALL timecall;timecall.log = &log_data;timecall.outdata = &serial_output;timecall.udp_output = &udp_output; // 20220801 yuphe  需要设置UDPtimecall.threadPerception = &per;  // 20220801 yuphe  获取数据timecall.m_LogFile = &file_check;     // 20221102 yuphe  日志内存检测
void main()
{TIMECALL timecall;timecall.log = &log_data;timecall.outdata = &serial_output;timecall.udp_output = &udp_output; // 20220801 yuphe  需要设置UDPtimecall.threadPerception = &per;  // 20220801 yuphe  获取数据timecall.m_LogFile = &file_check;     // 20221102 yuphe  日志内存检测// timecall.m_RosLog  = pthread_t id;int i, ret;ret = pthread_create(&id, NULL, thread_cb, (void *)&timecall);
}typedef struct TIMECALL_
{Log *log;result_serial::perception_result_serial *outdata;UDPSocket *udp_output = nullptr; // yuphe 20220801perception::Perception *threadPerception = nullptr; // yuphe 20220801FileManage *m_LogFile= nullptr; //增加内存检测 20221102 FileManage *m_RosLog = nullptr; //增加ROS日志检测 20221102 } TIMECALL;void *thread_cb(void *p) // void *serialOut
{TIMECALL *arg = (TIMECALL *)p;clock_t time_start = clock();while (true){// sizeof(Perception_output_proto) 346perception_output = arg->threadPerception->getOutdata();// print out data// for (int i = 0; i < 20; i++)// {//     std::cout << "OBJECT:" << i //               << " ID = " << ((int)perception_output.proto_objects[i].NoID) //               << " Pos = (" << (((double)perception_output.proto_objects[i].x) / 100) << " , " << (((double)perception_output.proto_objects[i].y) / 100) //               << ") Size = " << (((double)perception_output.proto_objects[i].L) / 100) << " X "//               << (((double)perception_output.proto_objects[i].W) / 100) << " X " //               << (((double)perception_output.proto_objects[i].H) / 100) << std::endl;// }// std::cout << ((int)perception_output.proto_sys_status// print out data end// yuphe 20220801arg->udp_output->UDPSocket::Send((char *)&perception_output, sizeof(perception_output));arg->log->toFile((unsigned char *)&perception_output, sizeof(perception_output));arg->m_LogFile->Start();//增加内存检测 20221102 // arg->outdata->callback_track_sub(*(arg->log), Sensor_state, System_state,my_version);double process_time = double(clock() - time_start) / CLOCKS_PER_SEC * 100;// ROS_ERROR_STREAM(" process_time......"<< process_time);pthread_testcancel();struct timeval tempval;tempval.tv_sec = 0;tempval.tv_usec = 100000; // 10hzselect(0, NULL, NULL, NULL, &tempval);}
}

总结

1.形式都是类似的,定义thread,然后在构造函数或者pthread_creat函数中将要处理的函数及参数放进去
2.pthread要放静态函数。对于静态函数的处理,尤其是对于类的非静态成员函数的处理要留意,这部分后续补充。目前采用的办法是thread th(&类名::函数名,对象地址,参数)的方式。
3.之前做java的时候,好像是继承Thread类,重写run函数,还有runable接口,好像在C+里面不怎么使用这种方式,后续遇到再补充。

附录

几篇博客:
C++多线程的实现
C++多线程详细讲解
C++ 多线程编程之在类中使用多线程(thread)的方法
C++多线程编程之thread类
C++ 在类里面使用多线程技术


http://www.ppmy.cn/news/7232.html

相关文章

别在用BigDecimal给自己挖坑了!

前言 工作中&#xff0c;我们都会用到BigDecimal来进行金额计算&#xff0c;但是他有许多坑&#xff0c;可能针对新手不注意的话&#xff0c;就给自己多加几个bug了。一起来看看吧。 创建 new BigDecimal()还是BigDecimal#valueOf()&#xff1f; 创建对象的时候应该使用Big…

【AcWing寒假每日一题2023】Day1——孤独的照片

目录问题描述思路与代码问题描述 原题链接&#x1f517;&#xff1a;4261. 孤独的照片 Farmer John 最近购入了 NNN 头新的奶牛&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#xff08;Holstein&#xff09;之一。 奶牛目前排成一排&#…

京东零售大数据云原生架构实践

通常谈到大数据&#xff0c;想到的是大数据平台、Hadoop生态或者数据湖技术&#xff0c;关注于大数据存储、大数据计算方向上的技术发展与应用&#xff1b;谈到云原生&#xff0c;想到的是微服务架构、容器化或者SRE&#xff08;Site Reliability Engineer&#xff09;运维范畴…

易基因|深度综述:癌症中RNA修饰机制的遗传和表观遗传失调(m6A+m1A+m5C+ψ)

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年11月12日&#xff0c;《Trends Genet》杂志发表了题为“Genetic and epigenetic defects of the RNA modification machinery in cancer”的综述文章&#xff0c;讨论了m6A、m5C、…

基于SpringBoot工程开发Docker化微服务

目录 1. 微服务容器化治理的优缺点 1.1 微服务容器化的优点 1.2 微服务容器化的缺点 2. 微服务的两种模式 2.1 Microservice SDK 2.2 ServiceMesh 3. 微服务容器化治理的推荐模式 4.Windows下开发容器化微服务&#xff08;非K8S&#xff09; 4.1 开发环境 4.2 代码框架…

云端办公后,协同软件也能轻松做好项目管理

最近很多朋友在后台问我&#xff0c;数字化移动办公环境下如何做好项目管理&#xff0c;但是问题不够聚焦&#xff0c;所以我决定从自己的理解出发&#xff0c;分享一下项目管理的一些心得。需要说明的是&#xff0c;传统项目管理和互联网项目管理存在很大的差异&#xff0c;尤…

Mybatis源码(三)如何操作数据库

前言 接着environmentElement获取数据源信息后&#xff0c;同级执行代码的mappersElement。里面参杂了mybatis缓存。 Mybatis源码&#xff08;三&#xff09;如何操作数据库 MyBatis源码&#xff08;二&#xff09;如何执行sql Mybatis源码&#xff08;一&#xff09;获取数…

【区块链 | EVM】深入理解学习EVM - 深入理解EVM操作码,让你写出更好的智能合约

那些非典型的开销导致经典的软件设计模式在合约编程语言中看起来既低效又奇怪。如果想要识别这些模式并理解他们导致效率变高/低的原因&#xff0c;你必须首先对以太坊虚拟机&#xff08;即 EVM&#xff09;有一个基本的了解。 你的一些编程“好习惯”反而会让你写出低效的智能…