C++中关于多线程并发访问实例函数与静态函数

news2025/1/23 7:12:03
问题
1 C++中多个线程共同执行一个实例函数,该函数是在线程的栈空间吗?对于函数中的多线程共享变量又是存储在哪里呢?

在这里插入图片描述

example: 在该例子中线程绑定当前对象(this)的实例函数captureVideo, 并将int参数传递过去。但是对于captureVideo中多个线程共享访问的变量,必须通过锁来处理,以防止出现竞态条件
void LoopHTCVPort::KeepCapture()
{
    std::thread t0(std::bind(&LoopHTCVPort::captureVideo, this, 0));
    t0.detach();

    std::thread t1(std::bind(&LoopHTCVPort::captureVideo1, this, 1));
    t1.detach();

    std::thread t2(std::bind(&LoopHTCVPort::captureVideo2, this, 2));
    t2.detach();

    std::thread t3(std::bind(&LoopHTCVPort::captureVideo3, this, 3));
    t3.detach();

    std::thread t4(std::bind(&LoopHTCVPort::captureVideo4, this, 4));
    t4.detach();
}

void LoopHTCVPort::captureVideo(int cameraId)
{
    RobotModel& model = RobotModel::GetGlobalInstance();
    int fps = 20;
    int delay = 1000 / fps;
    tSdkFrameHead frameinfo;
    BYTE* pbyBuffer;
    unsigned char* g_pRgbBuffer;
    int iDisplayFrames = 0;
    int width = 1920;
    int height = 1080;
    std::time_t last = ::GetTimeStamp();
    cv::Mat tempImage;
    while (true)
    {
        int distance = model.Odometer.GetRealValue();
        try
        {
            int index = 0;
            int hCamera;
            for(auto iter = g_hCameraArray.begin(); iter != g_hCameraArray.end(); iter++)
            {
                if (cameraId != index)
                {
                    continue;
                }

                std::time_t now = ::GetTimeStamp();
                cout << "capture last: " << (now - last) << endl;
                last = ::GetTimeStamp();

                g_pRgbBuffer = (unsigned char*) malloc (g_tCapabilityArray[cameraId].sResolutionRange.iHeightMax * g_tCapabilityArray[cameraId].sResolutionRange.iWidthMax * 3);
                hCamera = *iter;
                // 让SDK进入工作模式,开始接收来自相机发送的图像数据。如果当前相机是触发模式,则需要接收到触发帧以后才会更新图像.
                int cplaystatus = CameraPlay(hCamera);
                if(cplaystatus != CAMERA_STATUS_SUCCESS)
                {
                    cout << "CameraPlay faliure! cplaystatus"<< cplaystatus << endl;
                }
                int cgimagestatus = CameraGetImageBuffer(hCamera, &frameinfo, &pbyBuffer, 1000);
                if(cgimagestatus == CAMERA_STATUS_SUCCESS)
		        {
                    int processstatus = CameraImageProcess(hCamera, pbyBuffer, g_pRgbBuffer, &frameinfo);
                    if(processstatus != CAMERA_STATUS_SUCCESS)
                    {
                        cout << "CameraImageProcess error! code: " << processstatus << endl;
                    }
                    tempImage = cv::Mat(cv::Size(frameinfo.iWidth, frameinfo.iHeight), frameinfo.uiMediaType == CAMERA_MEDIA_TYPE_MONO8 ? CV_8UC1 : CV_8UC3, g_pRgbBuffer);
                    //在成功调用CameraGetImageBuffer后,必须调用CameraReleaseImageBuffer来释放获得的buffer, 否则再次调用CameraGetImageBuffer时,程序将被挂起一直阻塞,直到其他线程中调用CameraReleaseImageBuffer来释放了buffer
                    int releasestatus = CameraReleaseImageBuffer(hCamera, pbyBuffer);
                    if(releasestatus != CAMERA_STATUS_SUCCESS)
                    {
                        cout << "CameraReleaseImageBuffer error! code: " << releasestatus << endl;
                    }
                   
                    //test 保存图像到本地
                    // string folderprefix = Setting::ImageStoragePath;
                    // string filename = to_string(iDisplayFrames).append("camera.png");
                    // model.Disk.compressAndSave(matImage, 1, folderprefix, filename);
                    // cout << "image save: " << iDisplayFrames << endl;
                    // ++iDisplayFrames;                    
                    funcallback(cameraId, tempImage);
		        } else
                {
                    cout << "CameraGetImageBuffer occur error! code: " << cgimagestatus << endl;
                }
                // 需要释放内存,否则内存会一直增加
                free(g_pRgbBuffer);
                index ++;
                break;
            }
        }
        catch(std::exception e)
        {
            cout << "Detection camera capture pictures error! " << e.what() << endl;
            releaseHTCamera();
            free(g_pRgbBuffer);
        }
        //usleep(delay * 1000);
    }
}

2 在C++中,多个线程共同执行一个实例函数和共同执行一个静态函数有一些关键的区别。以下是一些主要的区别?

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1209952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】第五篇:基本操作(添加文件)

.git目录结构 我们在前文中提过了.git目录&#xff0c;也明确说了我们不能手动去.git目录下创建修改等任何操作。 添加文件 我们现在已经了解到&#xff0c;git是一个版本控制器&#xff0c;可以对我们的文件进行管理。而我们需要使用git管理文件的时候&#xff0c;我们必须将…

【工艺库】SMIC数字后端工艺库

工艺库文件 Calibredigital文件夹apollolefprimetimesynopsys TD系列文件夹 本来是想找一个工艺库&#xff0c;想要其包含逻辑综合和SPICE Model相关的库文件&#xff0c;但是找了很久也没有直接找到想要的&#xff0c;主要原因还是自己对工艺库文件的构成不是很清楚&#xff0…

Sentinel浅层介绍(上)

一、概述 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 二、核心概念 1、资源 资…

【机器学习】决策树算法理论:算法原理、信息熵、信息增益、预剪枝、后剪枝、算法选择

1. 决策树概念 通过不断的划分条件来进行分类&#xff0c;决策树最关键的是找出那些对结果影响最大的条件&#xff0c;放到前面。 我举个列子来帮助大家理解&#xff0c;我现在给我女儿介绍了一个相亲对象&#xff0c;她根据下面这张决策树图来进行选择。比如年龄是女儿择偶更…

【万字长文】Python 日志记录器logging 百科全书 之 日志过滤

Python 日志记录器logging 百科全书 之 日志过滤 前言 在Python的logging模块中&#xff0c;日志过滤器&#xff08;Filter&#xff09;用于提供更细粒度的日志控制。通过过滤器&#xff0c;我们可以决定哪些日志记录应该被输出&#xff0c;哪些应该被忽略。这对于复杂的应用…

【开发工具】gitee还不用会?我直接拿捏 >_>

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 git的一些前置操作 如何获取本地仓库 本地仓库的操作 远程仓库操作 合并两个仓库&#xff08;通用方法&#xff09; 从远程仓库拉取文件报错 fatal:refusing to merge unrelated histories 分支操作 注意&…

MHA实验和架构

什么是MHA&#xff1f; masterhight availabulity&#xff1a;基于主库的高可用环境下可以实现主从复制、故障切换 MHA的主从架构最少要一主两从 MHA的出现是为了解决MySQL的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30秒内自动完成故障切换。 MHA的数据流向和工…

QT windows与linux之间sokcet通信中文乱码问题解决方法

QT windows与linux之间sokcet通信中文乱码问题解决方法 linux发送与接收都转码utf-8: tcpClient ->write( send_msg.toUtf8());//解决乱码&#xff0c;发送转码 接收&#xff1a; QByteArray buffer tcpClient->readAll(); if(!buffer.isEmpty()) { // ui->plain…

[工业自动化-21]:西门子S7-15xxx编程 - 软件编程 - 如何快速看懂PLC梯形图?

目录 预备&#xff1a;电气图 1. 电路图 2. 电气图 一、梯形图概述 1.1 什么是梯形图 1.2 梯形图的作用 二、梯形图中的主要元素 三、梯形图的程序执行 3.1 梯形图扫描的原则 3.2 梯形图执行顺序 3.3 梯形图扫描 预备&#xff1a;电气图 1. 电路图 电路组成&#x…

雷达测角原理、测角精度、测角分辨率以及3DFFT角度估计算法汇总

1.角度测量方法 依据&#xff1a;电磁波的直线传播和雷达天线的方向性。 分类&#xff1a;振幅法测角、相位法测角 1.1 相位法测角 相位法测角利用多个天线所接收回波信号之间的相位差进行测角。如下图所示&#xff1b; 图 1 设在θ方向有一远区目标&#xff0c;则到达接收点…

【STM32】串口和printf

1.数据通信的基本知识 1.串行/并行通信 2.单工/半双工/全双工通信 类似于【广播 对讲 电话】 不是有两根线就是全双工&#xff0c;而是输入和输出都有对应的数据线。 3.同步/异步通信 区分同步/异步通信的根本&#xff1a;判断是否有时钟信号&#xff08;时钟线&#xff09;。…

MVC使用的设计模式

MVC使用的设计模式 一、背景 MVC模式是"Model-View-Controller"的缩写&#xff0c;中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View&#xff0c;或者同时改变两者。只要Controller改变了Model…

关于 Java NIO 的 Selector 的事儿,这篇文章里面全都有

前面 4 篇文章深入分析了 NIO 三大组件中的两个&#xff1a;Buffer 和 Channel&#xff1a; 【死磕 NIO】— 深入分析Buffer【死磕 NIO】— 深入分析Channel和FileChannel【死磕NIO】— 跨进程文件锁&#xff1a;FileLock【死磕NIO】— 探索 SocketChannel 的核心原理 这篇文…

ffmpeg5及以上-s和像素格式转换 画屏问题

环境: lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.10 Release: 22.10 Codename: kinetic拉下ffmpeg源码&#xff0c;6.0.1&#xff0c;4.3.6&#xff0c;5.1.4&#xff0c;依次安装作实验 ./configure --disable-x86asm …

msvcp140.dll丢失的解决方法、详细解析dll缺失原因及对电脑的影响

msvcp140.dll是一款Visual C Redistributable for Visual Studio 2015的运行时库&#xff0c;许多程序都需要依赖这个库才能正常运行。当msvcp140.dll丢失时&#xff0c;我们可能会遇到无法打开程序或游戏&#xff0c;甚至系统崩溃的问题。本文将详细介绍msvcp140.dll丢失的解决…

Linux--makefile

一、makefile的作用 makefile是一个文件&#xff0c;是围绕依赖关系和依赖方法的自动化编译工具 一个工程中的源文件有很多&#xff0c;按照不同的类型、功能、模块放在不同的目录中。而makefile定义了一系列的规则来指定&#xff0c;那些文件需要先编译&#xff0c;那些文件…

后端接口性能优化分析-程序结构优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

【开源】基于JAVA的电子元器件管理系统

目录 一、摘要1.1 项目简介1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录&注册&主页3.2 元器件单位模块3.3 元器件仓库模块3.4 元器件供应商模块3.5 元器件品类模块3.6 元器件明细模块3.7 元器件类型模块3.8 元器件采购模块3.9 元器件领用模块3.10 系统基础模块 …

PlantUML基础使用教程

环境搭建 IDEA插件下载 打开IEDA系列IDE&#xff0c;从FIle–>Settings–>Plugins–>Marketplace 进入到插件下载界面&#xff0c;搜索PlantUML&#xff0c;安装PlantUML Integration和PlantUML Parser两个插件&#xff0c;并重启IDE 安装和配置Graphviz 进入官网…

【Python 千题 —— 基础篇】欢迎光临

题目描述 题目描述 欢迎光临。为列表中的每个嘉宾打印欢迎光临语句。例如&#xff0c;有一份嘉宾列表 ["李二狗", "王子鸣"]&#xff0c;则需要根据嘉宾名单打印输出&#xff1a; 欢迎光临&#xff01;李二狗。 欢迎光临&#xff01;王子鸣。下面是一份…