曙光_deeplove
安徽霍邱人,长期从事遥感影像变化检测、机器学习、深度学习在图像分类、目标检测方面的应用工作
展开
-
多线程的重要资料-信号量
(1)https://www.cnblogs.com/ike_li/p/8984186.html(2)C#关于AutoResetEvent的使用介绍 | 康瑞部落(3)AutoResetEvent用法(一)_autoresetevent 的用法-CSDN博客(4)c++ - Is there an easy way to implement AutoResetEvent in C++0x? - Stack Overflow (5) c# - What is the C++ equivalent for Au原创 2023-11-22 09:56:54 · 178 阅读 · 0 评论 -
C++并发与多线程(14) | condition_varible、wait、notify_one、notify_all
当谈到并发编程,特别是在多线程或多进程的上下文中,条件变量(Condition Variables)、等待(wait)、通知一个(notify_one)和通知所有(notify_all)是常见的概念。它们用于协调线程的执行,以实现同步并避免竞争条件。: 条件变量是一种用于阻塞线程直到满足某种条件的同步原语。通常用于协调多个线程的活动。在许多编程语言和库中,条件变量被实现为允许线程等待特定条件满足的对象或结构。等待操作用于线程主动释放锁或互斥锁,并等待某个条件变为真。当线程在条件变量上调用等待。原创 2023-11-02 18:09:49 · 491 阅读 · 4 评论 -
C++并发与多线程(11) | unique_lock Ⅱ
这与一开始的锁定方式不同,因为在某些情况下你可能希望先尝试获取锁,然后在需要的时候再锁定。是C++标准库中的互斥量使用相关工具,它们通常不必直接一起使用,但它们的概念和用途有时会在互斥量的管理中互相关联,具体取决于你的使用情境。所以,unique_lock对象这个mutex的所有权是可以转移(但是不可复制的)。尝试给互斥量加锁,如果拿不到锁,则返回false,如果拿到了锁,返回true,这个函数是不阻塞的。来尝试获取锁,如果无法获取到锁,则不会阻塞,而是立即返回。以下是一个示例C++代码,演示如何使用。原创 2023-11-01 15:15:52 · 107 阅读 · 0 评论 -
C++并发与多线程(11) | unique_lock Ⅰ
unique_lock也可以带std::adopt_lock标记,含义相同,就是。我们会尝试用mutex的lock()去锁定这个mutex,但如果没有锁定成功,我也会立即返回,并不会阻塞在那里。像lock_guard一样,unique_lock支持很多标记,例如adopt_lock.unique_lock是个类模板,工作中,一般lock_guard(推荐使用);用这个defer_lock的前提是 你不能自己先lock,否则会报异常。这样等待一段时间的时候,另一个线程也在等待这个锁头,就会造成阻塞。原创 2023-10-30 19:31:28 · 100 阅读 · 0 评论 -
C++并发与多线程(9) | 线程安全访问控制
由于两个线程函数是同时的,因此这个时候在线程函数thread2中,由于mutex1已经在线程函数thread1中被锁定了,所以在线程函数thread2中拿不到mutex1的锁头了,因此这个时候是被在。必须保证加锁的顺序是一样的,比如先加的锁后解锁, Lock1 Lock2 Unlock2 Unlock1 ,则其他地方的加锁顺序,必须与这里的顺序一样,这个<<输出运算是全局的,因此也是本身线程不安全的,可以被多个线程访问,因此我们常常发现用cout打印输出,控制台的输出顺序是混乱的。转载 2023-10-30 10:43:29 · 140 阅读 · 0 评论 -
C++并发与多线程(8) | 互斥量
这就是为什么在多线程编程中,你需要使用同步机制,如互斥量、条件变量等,来确保线程之间的正确协作和共享资源的安全访问,而不是依赖于线程的创建顺序。然而,当涉及多个线程时,线程之间的执行顺序是不确定的,因此在多线程编程中,你需要格外小心,确保多个线程之间的共享资源访问是线程安全的。这意味着线程内的操作通常是原子的,不需要额外的同步措施来保护线程内的数据访问,因为在同一个线程内,不会有其他线程干扰。线程的执行顺序是由操作系统调度的,取决于各种因素,包括处理器的可用性、线程的优先级等。对象超出作用域时自动解锁。原创 2023-10-25 21:51:44 · 129 阅读 · 0 评论 -
C++并发与多线程(7) | 创建多个线程时数据共享的问题
借助vector存放多个线程thread对象,借助查看运行结果,发现有些乱,因为各个线程是并发执行的,与操作系统内部的运行调度机制有关。主线程也是等待了所有子线程运行结束才结束。原创 2023-10-25 13:38:37 · 447 阅读 · 0 评论 -
C++并发与多线程(6) | 传递临时对象作为线程参数的一些问题Ⅲ
(1)mutalbe的中文意思是“可变的,易变的”,是constant(即C++中的const)的反义词。在C++中,mutable也是为了突破const的限制而设置的,被mutable修饰的变量将永远处于可变的状态。使用这个函数修饰子线程的临时对象,这样成员变量m_i不用mutable进行修饰,而且myprint2()的输入参数(引用的方式)也不需要const进行修饰了。可以发现m_i值修改的时候,对象的地址实际上是不一样的,即使前面是const修饰的类对象。这里有一个需要注意的地方,就是在子线程中,原创 2023-10-24 11:40:01 · 401 阅读 · 0 评论 -
c++ 并发与多线程(12)线程安全的单例模式-2
(1)内部静态变量的懒汉单例是一种线程安全的懒汉单例模式,它利用了C++11的特性,即在局部静态变量(local static variable)上使用线程安全的延迟初始化。(6)在类的成员函数内部声明的静态变量通常用于维护特定于该函数或方法的状态,而不是与整个类相关的状态。(4)内部静态变量来实现懒汉单例模式的优势在于它具有很好的线程安全性,而不需要额外的锁定。(2)请注意,C++11内部静态变量的线程安全性是由C++标准库来保证的,因此无需手动加锁,代码非常简洁和高效。可以看到控制台输出终于正常了!原创 2023-10-23 15:36:56 · 633 阅读 · 0 评论 -
c++ 并发与多线程(12)线程安全的单例模式-1
单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。原创 2023-10-23 08:41:26 · 383 阅读 · 0 评论 -
C++并发与多线程(4) | 传递临时对象作为线程参数的一些问题Ⅰ
(1)若传递int这种简单类型参数,建议都是值传递,不要用引用,避免节外生枝。(2)如果传递类对象,避免隐式类型转换(eg: char *->string)。全部都在创建线程这一行就构建出临时对象(原创 2023-10-08 22:09:47 · 248 阅读 · 0 评论 -
C++并发与多线程(3) | 其他创建线程的方式
,所以执行完主线程后,ta会被销毁,但是所复制的TA对象依旧存在,因此就不存在对于main中所创建的对象ta,也就不会出现因为ta对象被销毁时,子线程崩溃的问题!即使对象(Ta类的对象ta)被析构了,拷贝得到的对象还是能继续在子线程中运行。这里就是子线程复制的对象(ta的复制对象)先析构,然后主函数里的ta对象在join()之后结束主线程时析构了。所以对于这个问题,只要保证这个类对象中没有引用,没有指针,就不会产生问题了。),所以执行完主线程后,ta会被销毁,但是所复制的TA对象依旧存在。原创 2023-10-08 19:41:02 · 100 阅读 · 0 评论 -
C++并发与多线程(2) | 线程运行开始和结束的基本方式
当程序运行起来,生成一个进程,该进程所属的主线程开始自动运行。当主线程从main()函数返回,则整个进程执行完毕。主线程从main()开始执行,。,如果主线程执行完毕了,就代表整个进程执行完毕了;此时,一般情况下,。。(这条规律有例外,后续说明)子线程创建的步骤:1)包含头文件thread2)要写初始函数3)在main中写启动这个子线程。运行效果:这个代码是有两个线程在跑的——有两条线同时在走。即使一条线堵住了,另一条还是可以走的。(1)创建了线程,线程执行起点(入口)myprint()原创 2023-10-07 21:21:11 · 191 阅读 · 0 评论 -
C++并发与多线程(1) | 并发、进程和线程的基本概念
(1)线程是用来执行代码的;(2)把线程理解成一条代码的执行通路,一个新线程代表一条新的通路。(3)一个进程自动包含一个主线程,主线程随着进程默默地启动并运行,我们可以通过编码来创建多个其他线程(非主线程);但是创建的数量最大都不建议超过200-300个,至于到底多少个合适,大家在实际的项目中可以不断调整和优化,有时线程太多的时候效率反而会降低。(4)因为主线程是自动启动的,所以一个进程中最少也是有一个线程(主线程)。(5)多线程程序可以同时做多个事,所以运行效率高。转载 2023-10-07 12:57:49 · 87 阅读 · 0 评论 -
QT学习之资料
(1)(2) (3)(4)(5) (6)(7)原创 2023-09-18 13:52:04 · 66 阅读 · 0 评论 -
c++笔记之构造函数中的default作用
c++笔记之构造函数中的default作用原创 2023-02-24 14:59:58 · 485 阅读 · 0 评论 -
关于询问trt推理部分bug
关于询问trt推理部分bug原创 2023-01-29 17:49:40 · 524 阅读 · 0 评论 -
C++小tips:指针变量的类型及大小
C++小tips:指针变量的类型及大小原创 2023-01-11 10:13:28 · 551 阅读 · 0 评论 -
c++传统算法图像处理(二)
c++传统算法图像处理(二)原创 2022-12-27 09:47:09 · 2514 阅读 · 0 评论 -
谷歌日志glog库的使用
谷歌日志glog库的使用原创 2022-12-26 10:41:50 · 702 阅读 · 0 评论 -
C++文件流
C++文件流原创 2022-12-20 18:39:01 · 308 阅读 · 0 评论 -
TensorRT的插件实战(1)
trt 插件实战原创 2022-07-22 12:16:44 · 698 阅读 · 0 评论 -
CUDA学习之原子操作
cuda学习转载 2022-07-09 22:41:40 · 1946 阅读 · 0 评论 -
CUDA编程之我的第一份代码
参考:我的第一份CUDA代码一、前言这是一份简单的CUDA编程入门,主要参考英伟达的官方文档进行学习,本人也是刚开始学习,如有表述错误,还请指出。官方文档链接如下:https://developer.nvidia.com/blog/even-easier-introduction-cuda/本文先从一份简单的C++代码开始,然后逐步介绍如何将C++代码转换为CUDA代码,以及对转换前后程序的运行时间进行对比,本文代码放在我的github中,有需要可以自取。https://gith原创 2022-06-09 15:22:25 · 311 阅读 · 0 评论 -
CUDA编程中的gridDim and blockDim
CUDA编程中的gridDim and blockDim原创 2022-06-09 01:23:10 · 2599 阅读 · 0 评论 -
tensorrt部署YOLOv5模型记录【附代码,支持视频检测】
该转载涉及yolov5的视频检测转载 2022-06-08 08:59:32 · 2400 阅读 · 0 评论 -
并行执行与并发执行
一、前言我们在另一篇博客中介绍了cuda核函数的并行机制,其中就提到:一个warp中的32个线程是并行执行的。一个block中不同warp是并发执行的。比如说一个block中分成10个warps,warp0执行了两步,这时可能会切换warp1去执行两步。再切换回warp0执行两步。也就是一个block中的warp不能并行执行。而是并发执行。那本文就学习记录一下什么是并行,什么是并发,这样有助于我们理解cuda核函数的线程执行机制。二、...原创 2022-05-31 10:47:06 · 1526 阅读 · 0 评论 -
opencv学习之路、轮廓查找与绘制(五)——最小外接矩形
转载:opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形 - 进击的小猴子 - 博客园转载 2022-04-08 09:46:23 · 412 阅读 · 0 评论 -
C++笔记之vector
1、关于vector大小(size)和容量(capacity)总结_weixin_30666401的博客-CSDN博客2、C++vector容器-容量和大小_唐火的博客-CSDN博客_vector容器的大小3、https://www.jb51.net/article/101101.htm(有条件的遍历vector删除元素)...原创 2022-04-03 10:50:57 · 574 阅读 · 0 评论 -
libtorch学习记录之实际代码
一、导出模型import torchimport osimport jsonimport torchvision.models as modelsimport torchfrom PIL import Imagefrom torchvision import transforms#from model import vggimport numpy as np # An instance of your model.device = torch.device("cuda" if原创 2022-01-25 23:18:31 · 1405 阅读 · 4 评论 -
libtorch和opencv
注意:linux下libtorch1.9 + opecv3(低版本的opencv)可以运行或者重新编译opencv或libtorch(要用同一个std c++11标准)可以运行不然直接linux下libtorch1.9 + opecv4会报cv::相关的错误!注意Windows下好像没有这个问题,libtorch1.9 + opecv4都是可以直接正常运行的!...原创 2022-01-21 11:23:58 · 2920 阅读 · 0 评论 -
C++笔记之多线程编程4
C++11之后,有了标准的线程库。c++11发布之前,c++并没有对多线程编程的专门支持,c++11通过标准库引入对多线程的支持,极大地方便了程序员的工作。需要说明的是:c++11标准库内部包裹了pthread库,因此,编译程序的时候需要加上-lpthread连接选项。#include <thread>#include <condition_variable>#include <mutex>1、std::threada. C++11中创建线程非常简单原创 2022-01-01 12:15:53 · 313 阅读 · 0 评论 -
C++笔记之多线程编程3
本篇文章继续写线程中的join和detach。详细说明二者的区别!一、线程状态:在一个线程的生存期内,可以在多种状态之间切换,不同的操作系统可以实现不同的线程模型。定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,下面几种状态是通用的:1)就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行。2)运行:占用CPU,正在进行中。3)休眠:暂不参与调度,等待特定事件发生。4)中止/终止:已经运行完毕,等待回收线程资源。二、线程环境:线程存在于进程之中,转载 2021-12-27 17:17:54 · 147 阅读 · 0 评论 -
C++笔记之多线程编程2
本篇文章,还是主要学习记录join()函数和detach()函数每个程序至少拥有一个线程,那就是执行main()函数的主线程。而多线程则是出现两个或两个以上的线程并行运行。即主线程和子线程在同一时间段同时运行。而这个过程中会出现以下几种情况:1)主线程先运行结束2)子线程先运行结束3)主线程和子线程同时结束在一些情况下,需要在子线程结束后,主程序才能结束。而一些情况则不需要等待,但需要注意一点,并不是主程序结束了其他子线程就立即停止,其他子线程会进入后台运行。一、join转载 2021-12-27 15:10:16 · 167 阅读 · 0 评论 -
C++笔记之多线程编程1
参考:C++ 多线程编程一、多线程原理线程是进程中的一个实体,是被系统独立分配和调度的基本单位。也就是说线程是CPU可执行调度的最小单位。注意:线程作为调度和分配的基本单位,进程作为独立分配资源的单位。线程基本不拥有资源,只拥有一点运行中必不可少的资源,在同一个进程中的所有线程都共享地址空间,线程间的大部分数据可以共享,并且相比较多进程而言,多线程间的通信开销小,启动速度快、占用资源少。二、多线程同步和互斥多个线程同时执行任务,肯定会存在线程间的同步和互斥:1、线程同步.转载 2021-12-27 10:15:09 · 439 阅读 · 0 评论 -
C++笔记之std::move ,std::ref,std::bind
本文简要学习记录。1、std::move使用场景如下:(1)c++标准库使用比如vector::push_back等这类函数时,会对参数的对象进行复制,连数据也会复制。这就造成了对象内存的额外创建,本来原意是想把参数push_back进去就可以了。(2)c++11提供了std::move函数来把左值转换为xrvalue,而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率地使用内存了。使用前提:(1)定义的类使用了资源并且定义了移动构造函数和移转载 2021-11-27 22:44:42 · 1231 阅读 · 0 评论 -
VS单步调试的无法进入断点、行号错乱等问题解决方法
参考自:VS单步调试的无法进入断点、行号错乱等问题解决方法_进击的菜鸟-CSDN博客_vs启动调试无法启动我在visual studio2019中debug调试shouxie ai的simple_yolo的工程代码时发现:debug调试时的箭头与界面输出不一致的情况。很明显箭头还没运行到界面显示的这个红色框的输出,但是界面已经显示了红色框的内容。最后还是跟着:VS单步调试的无法进入断点、行号错乱等问题解决方法_进击的菜鸟-CSDN博客_vs启动调试无法启动.原创 2021-11-25 11:49:05 · 676 阅读 · 0 评论 -
c++笔记之虚函数、虚继承、多态和虚函数表
1、什么是虚函数?虚函数是一种由virtual关键字修饰的一种类内函数,可分为虚函数和纯虚函数。还是先上代码看看吧:#include<iostream>#include<memory>class A{public: virtual void func(){std::cout<<"A func() called"<<std::endl;}};class B:public A{public: void func(){原创 2021-10-29 18:23:10 · 220 阅读 · 0 评论 -
C++笔记之多进程多线程1
一、引言最近发现多进程和多线程在工程中遇到的愈来愈多,而且其确实非常有用。所以我还决心要学习一下。首先看下廖雪峰对多进程多线程的概念描述:很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而转载 2021-10-26 16:27:39 · 695 阅读 · 0 评论 -
C++笔记之结构体和共用体
一、结构体指针数组定义一个结构体struct student{char id[7];char name[20];char *lastname;int salary;};声明一个结构体变量struct student *std[4];//指针数组(数组成员均为指针)注:每个数组成员均为结构体类型的指针变量std[1]->id = 123;给出代码如下:首先看代码1:#include<memory.h>#include<s原创 2021-10-14 23:52:44 · 184 阅读 · 0 评论