c++多线程那件事
文章平均质量分 75
不忘初心t
越野车无人驾驶领域
展开
-
YOLOv5 detect.py参数原理解析
当调用 --exist-ok 时,每次启动检测时,检测的结果不会再创建新的文件夹,而是将结果存放在在目前已有文件夹中。IoU是两个区域重叠的部分除以两个区域的集合部分得出的结果,通过设定的阈值,与这个IoU计算结果比较。例如:–classes 5 :只检测5这类目标,5在yolov5中给的对应的类别为车。例如:–classes 0 :只检测0这类目标,0在yolov5中给的对应的类别为人。的官方网址中找到如下图,根据不同的模型进行对比,选择需要的模型进行下载。原创 2023-11-23 09:14:49 · 213 阅读 · 0 评论 -
指针与引用的区别以及使用场景
引用从本质上讲是一个别名,是另一个变量的同义词,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化(先有这个变量,这个实物,这个实物才能有别名),而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量(初始化的时候代表的是谁的别名,就一直是谁的别名,不能变)。指针从本质上讲是一个变量,变量的值是另一个变量的地址,指针在逻辑上是独立的,它可以被改变的,包括指针变量的值(所指向的地址)和指针变量的值对应的内存中的数据(所指向地址中所存放的数据)。则使用指针或者引用。原创 2023-07-10 17:17:21 · 312 阅读 · 0 评论 -
使用Systemback克隆Ubuntu系统一键迁移
这⾥选择Live模式镜像原因(“转存为光盘镜像”按钮不可⽤)是ISO镜像⽂件不能⼤于4G,⽽我们要克隆的系统很可能会超过4G,关于如何制作 超出4G的ISO⽂件,也有解决办法,有点复杂,这⾥未做尝试,可以参考:解决systemback ⽆法⽣成超过4G的iso的问题。接着选中刚才创建好的镜像⽂件、选中待写⼊的U盘(U盘为ext4格式,如果未读出,点刷新按钮),点击“向⽬标设备写⼊”,开始刻录U盘。输⼊镜像名称,勾选“包含⽤户数据⽂件”,点击“创建新的”镜像,等待完成。直接点击“创建Live系统”,进⼊。原创 2023-05-20 17:23:02 · 1492 阅读 · 0 评论 -
在PC端的Ubuntu中导入RKNN docker镜像
本文总结了如何部署Docker Engine环境及如何导入RKNN官方打包好的docker镜像。仅供参考,文中如有错误请各位指正。原创 2023-05-19 17:03:22 · 419 阅读 · 1 评论 -
Docker CE 软件仓库镜像使用帮助-清华大学开源软件镜像站
Docker 提供了一个自动配置与安装的脚本,支持 Debian、RHEL、SUSE 系列及衍生系统的安装。如果你之前安装过 docker,请先删掉。发行版:centos/rhel。发行版:ubuntu。发行版:debain。原创 2023-05-19 10:34:23 · 859 阅读 · 0 评论 -
UTM坐标和WGS84坐标转换以及2000坐标系和WGS84的关系
引入了“实现不同”的概念后,就可以合理的解释这些坐标之间的区别了。通常所说的这两个坐标系差几厘米的含义,其实指的是CGCS2000与WGS84参考框架的理论差异,而不是用户坐标之间的差异。以上就是CGCS2000坐标系和WGS84坐标系的区别联系详细说明,主要包括了坐标系关系、参考椭球关系、坐标实现方式、地基框架与天基框架、坐标值差异、坐标实现差异等功能。(2)即便同在2000.0历元,如果WGS84坐标是米级精度,CGCS2000坐标是厘米级精度,不能说米级精度坐标和厘米级精度坐标只差几厘米。原创 2023-05-18 17:44:59 · 1780 阅读 · 0 评论 -
C++11多线程join()和detach()的理解
每一个程序至少拥有一个线程,那就是执行main()函数的主线程,而多线程则是出现两个或两个以上的线程并行运行,即主线程和子线程在同一时间段同时运行。主线程先运行结束子线程先运行结束主子线程同时结束在一些情况下需要在子线程结束后主线程才能结束,而一些情况则不需要等待,但需注意一点,并不是主线程结束了其他子线程就立即停止,其他子线程会进入后台运行。原创 2023-05-04 13:54:59 · 2901 阅读 · 0 评论 -
C++11多线程编程——互斥锁mutex用法
大家可以看到产生了一个很奇怪的现象,按理说输出“print thread:”之后应该跟着i的值,但是i的值却跑到“print main:”的后面了,这显然不是我们能要的结果,那为什么会这样呢?那么C++如何实现加锁的过程的呢?这个代码之前,在前面锁住一下,当线程B想来抢夺控制权的时候,发现这个地方已经被上锁了,无法抢夺,在需要加锁的地方,调用metex的lock()方法,解锁的地方unloc()方法,这样就可以顺序的输出了所需要的结果了。以上就是C++中关于互斥锁的机制,相当的简单容易理解。原创 2023-05-04 09:25:02 · 390 阅读 · 0 评论 -
C++ STL快速入门
容器也是顺序容器的一种,它是双向链表,所以不支持随机访问(就是不能用数组下标也不能用"原创 2023-05-04 10:29:17 · 328 阅读 · 0 评论 -
C++高并发多线程学习
1 创建std::thread,一般会绑定一个底层的线程。若该thread还绑定好函数对象,则即刻将该函数运行于thread的底层线程。2 线程相关的很多默认是move语义,因为在常识中线程复制是很奇怪的行为。3 joinable():是否可以阻塞至该thread绑定的底层线程运行完毕(倘若该thread没有绑定底层线程等情况,则不可以join)4 join():本线程阻塞直至该thread的底层线程运行完毕。原创 2023-04-28 14:45:43 · 1100 阅读 · 1 评论 -
C++11学习- CPU多核与多线程、并行与并发
随着计算机编程频繁使用,关于CPU的处理性能的讨论从未停止过,由于我最近在学习多线程相关的知识,那么就来理一理CPU的核心问题。原创 2023-04-28 15:18:17 · 1899 阅读 · 1 评论 -
C++11多线程编程——lock_guard和unique_lock
这个会在构造函数加锁,然后可以利用unique.unlock()来解锁,所以当你觉得锁的粒度太多的时候,可以利用这个来解锁,而析构的时候会判断当前锁的状态来决定是否解锁,如果当前状态已经是解锁状态了,那么就不会再次解锁,而如果当前状态是加锁状态,就会自动调用unique.unlock()来解锁。所以,以上两种加锁解锁的方法,加上前面文章介绍的mutex方法,具体该使用哪一个,要依照具体的业务需求来决定,当然mt.lock()和mt.unlock()不管是哪种情况,是肯定都可以使用的。原创 2023-05-04 09:31:47 · 224 阅读 · 1 评论 -
C++11多线程编程——原子操作
这纯粹就是C++这门语言的特性所决定的,C++这门语言是为性能而生的,它对性能的追求是没有极限的,它总是想尽一切办法提高性能。互斥锁是可以实现数据的同步,但同时是以牺牲性能为代价的。可以看到,我们在这里只需要定义atomic_int total(0)就可以实现原子操作了,就不需要互斥锁了。而性能的提升也是非常明显的,这就是原子操作的魅力所在。虽然很无奈,但这也是没有办法的,因为只有在保证准确的前提才能去追求性能。我们将一个数加一再减一,循环一定的次数,开启20个线程来观察,这个正确的结果应该是等于0的。原创 2023-05-04 09:46:37 · 106 阅读 · 0 评论 -
C++11多线程编程——生产消费者模型之条件变量
在生产消费者模型当中,肯定都会用到互斥锁的机制的,当生产者往队列中放数据的瞬间,消费者是不能取数据的,那这时候可能会碰见一个问题,如果生成者因为某些原因,放数据过慢,但是消费者取数据很快,当队列中没有数据了,消费者还去取的话,就会发生异常情况。在很多情况下,这都容易适用,但是有些情况下,却会产生一些异常情况。这时候我们设想,能否设计这样的一种机制,如果在队列没有数据的时候,消费者线程能一直阻塞在那里,等待着别人给它唤醒,在生产者往队列中放入数据的时候通知一下这个等待线程,唤醒它,告诉它可以来取数据了。原创 2023-05-04 10:03:02 · 413 阅读 · 0 评论 -
C++11多线程编程——信号量的实现
信号量里面用到了一个叫PV操作的东西,P操作时阻塞,一般用wait()函数,V操作是唤醒,一般用singal()函数,至于不叫WS操作,反而为什么叫PV操作呢?这里我也不得不提一句,条件变量和互斥锁组合使用真的非常强大,生产消费者模型中用到了,线程池中用到了,现在说的信号量也用到了,所以大家一定要好好掌握条件变量和互斥锁的使用,它们俩是你在多线程世界中纵横捭阖的利剑。假设先开始跑funA,执行到sem.wait()的时候,进入wait函数可知,count减1,小于0,会发生阻塞,等待其他线程唤醒。原创 2023-05-04 10:16:05 · 2204 阅读 · 0 评论 -
C++11多线程编程——死锁问题
thread1中的mt2在等待着thread2的mt2释放锁,而thead2中mt1却也在等待着thread1的mt1释放锁,互相都在等待着对方释放锁,进而产生了死锁。那么既然在最前面就已经上锁了,后面就不需要上锁了,而C++标准库并没有提供std::unlock()的用法,所以还是需要用到lock_guard,但是需要修改一点。这个就是死锁的一些解决方法,同时大家一定要记得尽量不要一段定义域内多次使用互斥锁,如果不可避免的要使用,一定要记得给锁定义顺序,或者使用要使用std::lock()上锁。原创 2023-05-04 10:19:17 · 695 阅读 · 0 评论 -
C++程序编译之谜(一)——多文件编译的奇怪现象
动态链接并没有说把库文件的代码插入到可执行文件中,而是在运行的时候链接库中的函数再加载到可执行文件中,也就是说运行的时候发现调用的函数是在动态库中,那么才去巴拉巴拉的加载。首先我猜测他们都是在window平台执行的,并且是用IDE来编译的,而不同的IDE功能都各不相同,有些IDE非常的智能,它可能会根据在main文件中导入的h文件自动去寻找对应的cpp文件,比如像上面我在main.cpp文件中导入了add.h的头文件,那么IDE会自动去寻找看看是否有add.cpp文件,有的话进行编译、链接,输出结果。原创 2023-05-04 13:33:31 · 449 阅读 · 0 评论 -
C++11多线程编程——线程池的实现
学一门新技术,还是要问那个问题,为什么我们需要这个技术,这个技术能解决什么痛点。原创 2023-05-04 10:10:50 · 507 阅读 · 0 评论