C++ thread的方式

2023-05-16

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

目录

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

第一种 在类中实现多线程

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

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

如果Perception中有另外一个成员,叫做mapOptimization,如果线程函数是mapOptimization的成员函数,

LidarMapping::mapOptimization::loopClosureThread

unique_ptr loopThread = std::make_unique<std::thread>(&mapOptimization::loopClosureThread,this->MO_);
会出问题
 要把mapOptimization::loopClosureThread 封装成LidarMapping 的一个函数loopClosure:
 loopThread = std::make_unique<std::thread>(&LidarMapping::loopClosure,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; // 10hz
        select(0, NULL, NULL, NULL, &tempval);

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

    TIMECALL timecall;
    timecall.log = &log_data;
    timecall.outdata = &serial_output;
    timecall.udp_output = &udp_output; // 20220801 yuphe  需要设置UDP
    timecall.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  需要设置UDP
    timecall.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 20220801

    perception::Perception *threadPerception = nullptr; // yuphe 20220801
    
    FileManage *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) 346
        perception_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 20220801
        arg->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; // 10hz
        select(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++ 在类里面使用多线程技术

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ thread的方式 的相关文章

  • Rt-thread的CAN应用2

    1 rtt中使能CAN1 2 CubeMX生成部分代码 xff0c 完成下面操作然后生成MDK ARM项目文件 3 将CubeMX生成的 HAL CAN MspInit 函数 粘贴到drv can c中 并在rt hw can init 函
  • QT多线程

    Qt多线程 1 QThread类 QThread类并不是代表一个新的线程 而是QT提供的一个接口 用于控制一个子线程 每个QThread的实例就代表着对一个新线程的一个控制类 对于第一次使用QT多线程的人 或许就会很迷惑很不适应 QThre
  • 无线传感网WSN

    第一章 绪论 WSN定义 无线传感网络是由大量的静止或移动的传感器以自组织和多跳的方式构成的无线网络 WSN系统组成 传感器节点 汇聚节点和管理节点 WSN的三个基本要素 传感器 感知对象 用户 观测者 WSN特点 1 自组织性 2 以数据
  • Java Thread Join

    join方法的作用 在A线程中调用了B线程的join 方法时 表示只有当B线程执行完毕时 A线程才能继续执行
  • 完美的Apache静态.htaccess文件 [discuz和home带301重定向]

    完美的Apache静态 htaccess文件 discuz和home带301重定向 本帖最后由 下砂 于 2009 11 13 10 32 编辑 先后修改过三次 加了301重定向 顶级域名和论坛二级域名 后rewrite base保持 状态
  • yield和join方法的使用。

    join方法用线程对象调用 如果在一个线程A中调用另一个线程B的join方法 线程A将会等待线程B执行完毕后再执行 yield可以直接用Thread类调用 yield让出CPU执行权给同等级的线程 如果没有相同级别的线程在等待CPU的执行权
  • 转帖:Bash实现“多线程”的例子

    以下文章转自 http hi baidu com wwy1640 blog item a74d8c50a272b86384352443 html Bash实现 多线程 的例子 2007 04 25 22 59 bin bash 2006 7
  • C++:多线程的正确打开姿势

    目的 本例简介c 11中thread库如何创建与停止线程 实现 如下的实例中 通过ThreadWrapper start 方法启动线程 通过ThreadWrapper stop 方法停止线程 线程的主体函数为Thread run 方法 in
  • ThreadLocal,看我就够了!

    ThreadLocal 开胃菜 研究过Handler的应该对ThreadLocal比较眼熟的 线程中的Handler对象就是通过ThreadLocal来存放的 初识ThreadLocal的可能被它的名字有所误导 ThreadLocal初一看
  • CyclicBarrier 使用详解

    1 CyclicBarrier 是什么 从字面上的意思可以知道 这个类的中文意思是 循环栅栏 大概的意思就是一个可循环利用的屏障 它的作用就是会让所有线程都等待完成后才会继续下一步行动 举个例子 就像生活中我们会约朋友们到某个餐厅一起吃饭
  • java多线程使用详解与案例,超详细

    文章目录 线程lamda表达式方式启动 简单 常用 java使用多线程的三种方式 继承Thread 实现Runnable 实现Callable 线程池的使用 守护线程 使用lamda表达式简化java的书写简单化案例如下 多线程综合案例 1
  • java常见笔试题目

    1 下列那一行代码编译后不会出现警告或错误 1 char c a 2 byte b 257 3 boolean b null 4 int i 10 5 float f 1 3 2 下面这段代码编译时会发生什么情况 public class
  • Java 线程的生命周期(对应七大状态)

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 线程的生命周期 线程状态的转换 通过代码输出线程的状态 代码如下 public class ThreadState public sta
  • JSVC简介之快速入门

    1 JSVC简介 Apache基金会会common 类似于guava 项目下的项目 2 为什么要使用JSVC java应用增加一种启动方式 Java的缺点 只能用main方法启动 应用能使用1024以下端口 为啥tomcat可以指定端口 系
  • python多线程编程: 使用互斥锁同步线程

    由于每个线程互相独立 相互之间没有任何关系 你干你的 我干我的 互相不干扰 如果要几个线程同时干一件事怎么办 由于互相不走动 如果一个线程已经做过了 另一个线程再去做 不就重复了吗 很容易乱套 现在假设这样一个例子 有一个全局的计数num
  • 笔试题10:Runnable接口与Thread类的区别?

    1 线程类继承自Thread则不能继承自其它类 而Runnable接口可以 2 线程类继承自Thread相对于Runnable来说 使用线程的方法更方便一些 3 实现Runnable接口的线程类的多个线程 可以更方便的访问同一变量 而Thr
  • c++11std::thread扩展

    最近 整理一下学习c 的文章 看到一篇文章 其中提到了thread local和std future 觉得这两东西很有趣 于是网上搜了一些资料 觉得很有帮助 希望可以对大家学习c 线程有所帮助 http www cnblogs com ha
  • pthread_attr_init线程属性

    1 线程属性 线程具有属性 用pthread attr t表示 在对该结构进行处理之前必须进行初始化 在使用后需要对其去除初始化 我们用pthread attr init函数对其初始化 用pthread attr destroy对其去除初始
  • Java-多线程-给线程命名

    Java 多线程 给线程命名 在Java中 通过继承Thread创建的线程 有以下两种方式可以给线程命名 通过构造器命名 因为线程类继承自Thread类 所有也继承了Thread的name属性 可以通过super的方法调用父类构造器 将na
  • POSIX线程:API

    一 线程创建与取消 1 线程创建 1 1 线程与进程 相对进程而言 线程是一个更加接近于执行体的概念 它可以与同进程中的其他线程共享数据 但拥有自己的栈空间 拥有独立的执行序列 在串行程序基础上引入线程和进程是为了提高程序的并发度 从而提高

随机推荐

  • 如何在 macOS 使用 AList + RCLONE 把网盘挂载到本地

    之前接触最多的可能还是百度网盘 xff0c 它的免费容量比较大 xff0c 我们在下载和分享一些文件的时候经常会用到 xff0c 但是如果文件比较大 xff0c 加上限速 xff0c 使用体验并不算太好 其实除了下载文件 xff0c 我很少
  • jdk 安卓sdk 安装

    https www cnblogs com gufengchen p 11038029 html jdk sdk安装详细步骤 https www jianshu com p 8fb367a51b9f utm campaign 61 haru
  • 通过 Plex + Trakt 同步观看状态和评分,轻松记录你的追剧观影史

    喜欢看电影 追剧 追综艺的朋友想必都有做记录的习惯 xff0c Plex 的用户里用豆瓣的人估计不少 xff0c 使用豆瓣标记电影 写影评 短评和参与线上讨论是非常方便的 xff0c 但是豆瓣对电视剧的支持相对还是比较弱 xff0c 很多剧
  • macOS 如何设置 AList、RCLONE、xTeVe 开机启动后台运行

    之前和大家分享了 macOS 上 AList RCLONE xTeVe 的使用教程 xff0c 他们基本上都是通过终端命令或者 Unix 可执行文件运行的 xff0c 启动后需要保持运行状态才能持续提供服务 xff0c 今天分享一下如何让它
  • zynqmp zcu102 SD卡驱动调试

    新板卡使用sdhci0 xff0c 以前是sdhci1 xff0c 由于官方没有使用sdhci0所以需要手动添加设备树 xff1a amp sdhci0 clock frequency 61 lt 60000000 gt status 61
  • zynqmp zcu102 arm linux (uboot网卡输出调试信息)

    需求 xff1a 使用网卡输出自检 调试信息 由于uboot启动完成就退出运行 xff0c 进入Linux启动 xff0c 不是进入消息循环处理网络协议栈 xff0c 且没有现成的udp接口发送数据 xff0c 所以想在启动中输出调试信息调
  • libiec61850-1.4 库的使用和修改(goose)

    目的 xff1a 使用libiec61850 1 4 库接收和发送goose数据 xff0c 环境Ubuntu 18 04 4 LTS 问题 xff1a 使用libiec61850 1 4 examples goose publisher例
  • zynqmp zcu102 arm 裸机SD卡驱动

    1 加载PL端提供的 HDF 2 创建hello world例程 xff08 bsp xff09 3 在main函数中调用驱动初始化sd卡 void mmc test void s32 Status XSdPs InstancePtr XS
  • ubuntu / 麒麟 播放PCM音频文件

    ubuntu18 04 麒麟 播放PCM音频文件 xff0c 源码来源于网友文章再修改 xff0c 仅测试用 xff01 如果应用在产品上需要再优化 最简单的SDL2播放音频的例子 xff08 SDL2播放PCM xff09 Simples
  • QT中关于close()系统调用 和qt close()冲突

    参考 xff1a 点击打开链接 xff08 http bytes com topic c answers 856501 use close int unistd h qt xff09
  • 解决QScrollArea不能出现滚动条的问题

    转载 xff1a QScrollArea实在是一个非常强大的控件 xff0c 节省了很多重复工作 但如果使用Qt Creator中的ui designer来制作界面的话 xff0c 就会出现滚动条无法出现的问题 而在 C 43 43 GUI
  • QT子窗口全屏显示与还原问题

    子窗口全屏显示 vws gt setWindowFlags Qt Dialog vws gt showFullScreen 之后窗口还原时调用 this gt showNormal 对顶级窗口有效 this gt setWindowFlag
  • 设置系统屏幕关闭及系统休眠时间

    include lt Powrprof h gt pragma comment lib 34 PowrProf lib 34 DWORD lockTime 61 0 void SetPowerPolicy SYSTEM POWER POLI
  • 如何编译和运行C++程序

    如何编译和运行C 43 43 程序 C 43 43 和C语言类似 xff0c 也要经过编译和链接后才能运行 我们在C语言课程的时候 xff0c 讲了如何使用 VS VC 6 0 VC 43 43 2010等常见开发工具 xff0c 它们除了
  • 简单理解socket(AF_INET&SOCK_STREAM,SOCK_DGRAM)

    套接字 在任何类型的通信开始之前 xff0c 网络应用程序都必须创建套接字 套接字最初是为同一主机上的应用程序所创建 xff0c 使得主机上运行的一个程序 xff08 又名一个进程 xff09 与另一个运行的程序进行通信 这就是所谓的进程间
  • 为什么编程语言中需要堆和栈

    概述 在我们学习 C C 43 43 和 Java 等编程语言的时候经常要学习一个概念就是堆和栈 xff0c 对于大部分经验丰富的工程师来说 xff0c 堆和栈是再熟悉不过的东西了 xff0c 堆和栈都是存储程序运行时变量的地方 但这个时候
  • GT1050 PointPillar成功运行

    目的 之前在感知这里主要是考传统的算法 xff0c 但是遇到了瓶颈 xff0c 计算效率提不上来 xff0c 所以尝试一下其他的方法 目前看到pointpillar这种方法效果比较好 xff0c 就打算尝试一下 跑通测试一下效果 piont
  • 使用离线数据测试apollo7.0

    https zhuanlan zhihu com p 510712104 cd apollo 视觉测试 xff1a 1 启动dreamview 并选择车辆和地图 scripts bootstrap sh 2 启动transform模块 cy
  • 相机、激光雷达坐标系相互转换

    目录 读入外参和摄像头内参配置文件读入TF读入 激光雷达坐标系转到摄像头坐标系摄像头坐标系转到激光雷达坐标系 读入外参和摄像头内参 配置文件读入 std span class token double colon punctuation s
  • C++ thread的方式

    多线程的实现方式 xff0c 只做记录 xff0c 自己看 目录 第一种 在类中实现多线程第二种 在类外第三种 没有类第四种 pthread 定时触发总结附录 第一种 在类中实现多线程 新建thread对象 xff0c 传入类的成员函数名称