基础篇:多线程所需知识:

news2024/11/16 7:45:47

前言:

  • 这里的多线程主要指算法部署时所涉及的多线程内容,对于其他多线程知识需要自行补充
  • 常用组件有thread、mutex、promise、future、condition_variable
  • 启动线程,thread,以及join、joinable、detach、类函数启动为线程
  • 生产者消费者模式
  • 队列溢出的问题,生产太快,消费太慢。如何实现溢出限制
  • 生产者如何拿到消费反馈
  • RAII+接口模式的生产者消费者封装,以及多batch的体现

1、线程:

本单元是https://blog.csdn.net/zhuangtu1999/article/details/130903594?spm=1001.2014.3001.5501#t1的实例化单元,更加注重在实战中如何运用线程知识

         上图是我们之前的一个例子,可以看到如果没有t.join(),那么线程是会崩掉的,因为他的生命周期在main()函数里面,所以当main结束之后他也会析构掉,但线程里面还在执行,所以会出现错误。

         那如果要是没有启动线程就join呢?

        可以看到也是会出错的。

所以可以发现:当线程启动了,就必须join,但如果线程没有启动,那就一定不能join,那这样肯定是很麻烦的,所以引申出来了下面的joinable概念:

joinable:

 if (t1.joinable())
    {
       t1.join();
    }

这样的话无论线程有没有启动,退出的时候都可以正常退出。

detach

 detach是分离线程,取消管理权,使线程变成野线程。但这个通常不建议使用

如果一个线程一旦detach之后,线程就交给了系统作管理,当程序结束后自动退出

 可以看到在延迟了500毫秒之后,worker down这条语句来不及打印,就会直接退出。

参数传递:

 在传递引用类型时,传入参数应用ref

 类函数:

如果我们正常想搞一个类函数私有线程和方法,那我们首先想到的是可以这样做:

class Infer{
    public:

        Infer(){

            worker_thread = thread(Infer_worker);
    
    }
    private:
    
    thread  worker_thread;
    
    void Infer_worker(){

    }
};

但这样做会报错:

 显示他不是一个静态函数,但如果我们想要把这个函数加上static

这样做的确可以成功运行,但每次都要加上sellf很麻烦。

 可以通过取地址方式,保留this参数,这样做可以避免static无法使用this->的操作。

 

2、生产者消费者模式

生产者:

queue<string> qjobs_;

void video_capture(){
    int pic_id = 0 ;
    while (true)
    {
        /* code */
        char name[100];
        sprintf(name ,"PIC - %d" , pic_id++);
        printf("生产了一个新图片:%s\n" , name );
        qjobs_.push(name);
        this_thread::sleep_for(chrono::milliseconds(1000));
    
    }
      
}

消费者:

void infer_worker(){

    while (true)
    {
        if (!qjobs_.empty())
        {
            /* code */auto pic = qjobs_.front();
            qjobs_.pop();

            printf("消费掉一个图片:%s \n" , pic.c_str());
            this_thread::sleep_for(chrono::milliseconds(1000));
        }
        this_thread::yield();
        
    }
    
}

结果就是这样:

由于生产一个图片需要1ms,消费一张图片需要1ms,所以二者刚好是收支平衡的状态。

但这个设计到了一个共享资源访问的问题,queue不是线程安全的。

这就是设计到了mutex(https://blog.csdn.net/zhuangtu1999/article/details/130917521?spm=1001.2014.3001.5501)

我们设计了一个mutex然后在创建和消费的时候都加上🔓:

mutex lock_;
void video_capture(){
    int pic_id = 0 ;
    while (true)
    {
        /* code */
       { 
        lock_guard<mutex>  l(lock_);
            char name[100];
            sprintf(name ,"PIC - %d" , pic_id++);
            printf("生产了一个新图片:%s\n" , name );
            qjobs_.push(name);
            this_thread::sleep_for(chrono::milliseconds(2000));
            
        }
    
    }
      
}

void infer_worker(){

    while (true)
    {
        if (!qjobs_.empty())
        {
                {           
                    lock_guard<mutex> l(lock_);
                    auto pic = qjobs_.front();
                    qjobs_.pop();

                    printf("消费掉一个图片:%s \n" , pic.c_str());
                }
            this_thread::sleep_for(chrono::milliseconds(1000));
        }
        this_thread::yield();
        
    }
    
}

这就变成了一个原子操作。

condtion_varible:

如果生产太快,消费太慢,队列就会不断的增长,如果存储的是图片,可能就会造成显存爆炸:

 所以设置一个上限就很有必要

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

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

相关文章

自动化测试 selenium(测试系列7)

目录 前言&#xff1a; 1.什么是自动化测试 2.Selenium是什么 3.Selenium原理 4.SeleniumJava环境搭建 5.Selenium常用的API使用 5.1定位元素findElement 5.1.1css选择器 5.1.2id选择器 5.1.3类选择器 5.1.4xpath选择器 5.2操作测试对象 5.2.1click点击对象 5.2.…

[PyTorch][chapter 45][RNN_2]

目录&#xff1a; RNN 问题 RNN 时序链问题 RNN 词组预测的例子 RNN简洁实现 一 RNN 问题 RNN 主要有两个问题&#xff0c;梯度弥散和梯度爆炸 1.1 损失函数 梯度 其中&#xff1a; 则 1.1 梯度爆炸&#xff08;Gradient Exploding&#xff09; 上面矩阵进行连乘后…

【C++】开源:Boost库常用组件配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Boost库常用组件配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

Vue触发兄弟级组件中的某个方法

要求&#xff1a;页面上有两个兄弟级组件&#xff0c;假如我点击组件 1 中的按钮&#xff0c;需要触发组件 2 中的某个方法&#xff1b; 在这里&#xff0c;以购物车页面为例&#xff1a;我选择商品列表中的某个商品选中状态&#xff0c;在结算组件中根据列表中是否有未选中状态…

《向量数据库指南》——Milvus Cloud2.2.12 易用性,可视化,自动化大幅提升

Milvus Cloud又迎版本升级,三大新特性全力加持,易用性再上新台阶! 近期,Milvus Cloud上线了 2.2.12 版本,此次更新不仅一次性增加了支持 Restful API、召回原始向量、json_contains 函数这三大特性,还优化了 standalone 模式下的 CPU 使用、查询链路等性能,用一句话总…

三言两语说透process.stdout.write和console.log的区别

Node.js中的process.stdout.write和console.log都是用于向标准输出流(stdout)打印输出的方法&#xff0c;但二者在使用场景和实现方式上有些区别。本文将详细介绍process.stdout.write和console.log的区别。 process.stdout.write介绍 process.stdout.write是Node.js中的一个…

undefined reference to `__android_log_print‘

报错描述 在 Android NDK 相关的工程构建中&#xff0c;出现报错&#xff1a; undefined reference to __android_log_print’ 翻译成 QM 能理解的话&#xff1a; 在链接阶段&#xff0c; 遇到一个需要被链接的符号 __android_log_print, 但是没有在给出的依赖库里面找到 __an…

关于会议OA需求分析与开发功能设计

前言&#xff1a;现如今&#xff0c;企业在会议管理方面对OA系统的需求越来越高。因为会议是企业内部沟通和协作的重要环节&#xff0c;一个高效的会议管理系统可以帮助企业提升会议效率、降低成本&#xff0c;并且提高内部信息共享的效果。 目录 一&#xff0c;以下是OA系统在…

C语言实现通讯录--动态版

一、题目要求 实现一个通讯录&#xff0c;联系人的数量可多可少 二、解题思路 1.在静态版本的基础上改用动态的方法&#xff1a; &#xff08;1&#xff09;默认能够存放三个人的信息 &#xff08;2&#xff09;不够的话&#xff0c;每次增加两个人的信息 2.其他功能不变 三…

学习自动化测试该怎么学?6个步骤轻松拿捏

自动化测试作为脱离手工测试的基本核心内容&#xff0c;其重要性不言而喻了&#xff0c;而且我们来看近期大厂的一些招聘信息显示&#xff0c;基本上自动化测试是必备前提&#xff0c;没有这个基本就不用谈后面的问题了&#xff0c;下面我们通过联想集团的一个软件测试工程师的…

【C#】async和await 续

前言 在文章《async和await》中&#xff0c;我们观察到了一下客观的规律&#xff0c;但是没有讲到本质&#xff0c;而且还遗留了一个问题: 这篇文章中&#xff0c;我们继续看看这个问题如何解决! 我们再看看之前写的代码&#xff1a; static public void TestWait2() {var t…

VR党建主题数字互动虚拟展馆软件开启党建铸魂育人新篇章

当今时代新媒体技术的发展对大学生的学习、生活等产生着深远的影响。高校作为党建育人的重要场所&#xff0c;充分借助VR技术的强大优势&#xff0c;合理运用到育人工作中&#xff0c;能够不断丰富教育内容。VR智慧党建展厅展馆结合VR技术营造的虚拟现实空间&#xff0c;将党的…

layui手机端上传文件时返回404 Not Found的解决方案(client_body_temp权限设置)

关于 1.client_body_temp的作用 client_body_temp是一个指令指定保存客户端请求体临时文件的目录路径&#xff0c;以及是否进行缓存的配置指令。 在Web服务器中&#xff0c;当客户端向服务器发送请求时&#xff0c;请求体中包含了请求的主体部分&#xff0c;比如表单数据、上…

基于flask徐州市天气信息可视化分析系统【纯干货分享,附源码04600】

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对天气信息等问题&#xff0c;对天气信息进行…

【网络通信】一文读懂TCP/IP基础,IP、端口、网关、web、超媒体

TCP/IP贯穿在我们学习计算机的生涯中&#xff0c;但TCP/IP终究是个什么玩意儿&#xff1f;在了解他之前我们先看一段历史&#xff1a; 在网络发展初期&#xff0c;许多研究机构、计算机厂商和公司都开始大力发展计算机网络。自ARPANET出现之后&#xff0c;许多商品化的网络系统…

实现二叉排序树

一&#xff1a;二叉树和二叉搜索树 二叉树中的节点最多只能有两个子节点&#xff1a;一个是左侧子节点&#xff0c;另一个是右侧子节点。这个定义有助于我们写出更高效地在树中插入、查找和删除节点的算法&#xff0c;二叉树在计算机科学中的应用非常广泛。 **二叉搜索树&…

Consul的容器服务更新与发现

Consul的容器服务更新与发现 一&#xff1a;Docker consul的容器服务更新与发现&#xff08;1&#xff09;什么是服务注册与发现&#xff08;2&#xff09;什么是consulconsul提供的一些关键特性&#xff1a; 二&#xff1a;consul 部署consul服务器1. 建立 Consul 服务2. 查看…

一文带你全面理解向量数据库

近些年来&#xff0c;向量数据库引起业界的广泛关注&#xff0c;一个相关事实是许多向量数据库初创公司在短期内就筹集到数百万美元的资金。 你很可能已经听说过向量数据库&#xff0c;但也许直到现在才真正关心向量数据库——至少&#xff0c;我想这就是你现在阅读本文的原因…

美国过境签证的办理流程和注意事项

美国过境签证是一种临时签证&#xff0c;允许你在前往其他国家的途中经过美国。这对于很多旅行者来说是一个便捷的选择&#xff0c;但在申请和办理过程中也需要注意一些要点。 首先&#xff0c;申请美国过境签证需要前往美国驻中国大使馆或领事馆递交申请。以下是办理美国过境签…

四磺酸酞菁锌,61586-86-5,Zn(II) Phthalocyanine tetrasulfonic acid,广泛用于染色

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 四磺酸酞菁锌试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;四磺酸酞菁锌 英文名称&#xff1a;Zn(II) Phthalocyanine tetrasulfonic acid CAS号&#xff1a;61586-86-5 分子式&#xff1a;C32H…