- 博客(299)
- 收藏
- 关注
原创 回溯算法(C/C++)
我们可以这么理解,已知可以选择走的路径总长度为n,在当前的横向遍历节点上,已知前面走过路径上长度为size,然后总共是需要走的长度为k,那么是不是可以说还需要走k-size的长度的路径?对于子集问题,其实跟前面的不同,子集是每一个递归的节点都要进行数据的收集,而前面的组合问题都是有条件限制的才执行收集的操作,比如递归收集数字和为target的组合之类的。这个问题其实是组合总和2的一个派生问题,本质上是差不多的,无法就是需要一个东西来去标记一下使用过的数据,避免下次重新去使用。下面三个案例练练手看看。
2025-02-26 18:54:45
2214
原创 Linux-----线程同步(条件变量)
上面这个写法还是会存在资源竞争的情况,也就是抢锁,实际上并不是生产者生产后消费者马上执行,而是互相竞争的。
2025-01-18 21:08:47
498
原创 Linux-----线程同步(资源竞争和同步锁)
我们在读操作中加了1s休眠,只要有一个读线程获得锁,在1s内写操作是无法执行的,其它读操作就可以有充足的时间执行,因此读操作就会连续发生,写操作必须等待所有读操作执行完毕方可获得读写锁执行写操作。我们可以尝试将策略更改为“写优先”,当写操作阻塞时,读线程无法获取锁,避免了写线程持有锁的时间持续延长,使得写线程获取锁的等待时间显著降低,从而避免写饥饿问题。如果一个线程试图获取一个已经被其他线程持有的锁,那么请求锁的线程将被阻塞,直到锁被释放。读操作:在读写锁的控制下,多个线程可以同时获得读锁。
2025-01-17 00:26:45
1120
原创 Linux-----线程操作(终止)
当某个线程调用pthread_exit方法后,该线程会被关闭(相当于return)。线程可以通过retval向其它线程传递信息,retval指向的区域不可以放在线程函数的栈内。其他线程(例如主线程)如果需要获得这个返回值,需要调用pthread_join方法。这个方式就是使用异步自动回收,主线程不需要等待子线程就会自动回收,跟join不同,这里没有同步而是异步。线程函数内部调用pthread_exit函数;其他线程调用pthread_cancel函数。线程函数执行return语句;
2025-01-14 19:41:56
571
原创 Linux-----进程通讯(消息队列)
mq_receive()同样的也是没有超时机制,当没有数据来的时候就处于阻塞状态。对于 mq_send()这个方式就是发送没有超时机制,可以一直处于阻塞状态。该数据类型定义在mqueue.h中,是用来记录消息队列描述符的。实质上是int类型的别名。
2025-01-09 21:39:59
662
原创 Linux-----进程处理(execve跳转)
const char *__pathL:执行程序的路径* char *const __argv[]: 对应执行程序main函数的参数* char *const __envp[]:传递的环境变量* (1):第一个参数固定是程序的名称->执行程序的路径* (2):执行程序需要传入的参数* (3):最后一个参数一定是NULLint* return 返回值* 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了execve()跳转接口。
2025-01-09 17:47:18
207
原创 Linux-----进程通讯(共享内存)
mmap系统调用可以将一组设备或者文件映射到内存地址,我们在内存中寻址就相当于在读取这个文件指定地址的数据。truncate和ftruncate都可以将文件缩放到指定大小,二者的行为类似:如果文件被缩小,截断部分的数据丢失,如果文件空间被放大,扩展的部分均为\0字符。不同的是,前者需要指定路径,而后者需要提供文件描述符;ftruncate缩放的文件描述符可以是通过shm_open()开启的内存对象,而truncate缩放的文件必须是文件系统已存在文件,若文件不存在或没有权限则会失败。
2025-01-09 00:58:54
348
原创 Linux-----结构体与联合体,大小端模式
64为操作系统为例:对于data这个结构体,原本是20个字节的,划分为4,4,4,4,4,如果扩展为8位的话,前两个4组成一个8,中间两个4组成一个8,剩下最后一个4扩展为一个8,所以划分8,8,8,一共24字节,最后加上指针占8字节,总共32字节。一个int 是4字节,上面有10个char,需要10个字节,根据结构体字段空间对齐的特性,应该按照4个字节划分,应该划分为4,4,4,4,第三个4实际上只存储了2个char类型,所以整体就是16个字节,如果按照下面的情况的话就存储满了,刚好满16字节。
2025-01-07 01:22:16
916
原创 Linux-----进程通讯(管道Pipe)
调用open()打开有名管道时,flags设置为O_WRONLY则当前进程用于向有名管道写入数据,设置为O_RDONLY则当前进程用于从有名管道读取数据。设置为O_RDWR从技术上是可行的,但正如上文提到的,此时管道既读又写很可能导致一个进程读取到自己发送的数据,通信出现混乱。参数s:指向一个字符串的指针,如果s不是空指针且指向的不是\0字符,则perror会在s后添加一个冒号和空格作为前缀,输出错误信息,否则不输出前缀,直接输出错误信息。但要注意的是,无论是有名管道还是匿名管道,
2025-01-06 21:52:34
732
原创 Linux-----进程处理(waitpid,进程树,孤儿进程)
在上面的例子中,父进程在子进程结束前就结束了,那么其子进程的回收工作就交给了父进程的父进程的父进程。在ps -ef的输出结果中,我们发现,CMD部分有的行带有[],而有的没有,前者属于内核线程,内核线程在内核空间执行,不占用任何用户空间资源,它们在技术上是线程,而在许多方面表现得像独立的进程,因此也会被ps命令检索到。第一个内核线程的pid为2,它是所有其它内核线程的祖先。实质上,1号进程就是systemd,它由内核创建,是第一个进程,负责初始化系统,启动其他所有用户空间的服务和进程。它是所有进程的祖先。
2025-01-05 19:59:01
581
原创 Linux-----进程处理(execve执行可执行文件)
const char *__pathL:执行程序的路径* char *const __argv[]: 对应执行程序main函数的参数* char *const __envp[]:传递的环境变量* (1):第一个参数固定是程序的名称->执行程序的路径* (2):执行程序需要传入的参数* (3):最后一个参数一定是NULL* return 返回值* 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了。
2025-01-05 16:05:08
351
原创 Linux-----进程处理(文件IO资源使用)
下面代码是通过父进程和子进程对同一个文件IO资源进行操作,父进程和子进程都对这个进程进行写入操作,我们都知道这两个进程实际上是并发的,所以需要一个同步机制来去操作同一个资源(后面再深入去说明同步的api,这里使用延时就可以解决了)
2024-12-26 16:31:12
473
原创 Linux-----进程处理(子进程创建)
【尚硅谷嵌入式Linux应用层开发,linux网络编程,linux进程线程,linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?
2024-12-26 15:36:41
260
原创 Linux文件IO
对与系统IO ,当我们调用read,write读写数据的时候,操作系统会进入到内核来去调用这些api,但是如果是多次循环读写的话频繁的进入内核是和消耗性能的。所以标准的IO(fopen、fread、fwrite)会有一个用户buffer来缓存文件的数据,当使用fread或者fwrite的时候会直接在这个buffer里面读取,而不需要去频繁的进入内核。当buffer被用满了之后,才会调用read或者write进入到内核读取数据放到buffer中。应用层触发异常,传递给内核,内核去处理异常。
2024-12-25 22:21:42
285
原创 Linux------进程处理(system库函数)
【尚硅谷嵌入式Linux应用层开发,linux网络编程,linux进程线程,linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?第一个是表示父进程 ./main ,第二个是指向父进程id。可以显示父进程的信息,而。没有直接显示父进程。
2024-12-25 22:17:02
324
原创 x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV然后配置到C++和python环境中
【代码】x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV。
2024-12-21 16:00:13
381
原创 Linux网络操作指令
视频教程:【Linux通过命令行连接wifi——nmcli、nmtui、wpa_supplicant】https://www.bilibili.com/video/BV1nRsjeqEJ3?它通常用于 Linux 系统,特别是在需要脚本化管理网络连接或没有图形界面的环境下。:广播地址是子网中的最后一个 IP 地址,用于向同一子网内的所有设备发送广播包。提供了一种高效的方式来查看、创建、修改、启用或禁用网络连接。注意,这里这个是表示广播地址,不是网关。是一个命令行工具,用于管理和配置。ssid查看网络信息。
2024-12-12 01:40:36
932
原创 Ubuntu换源,Cmake,交叉编译,宏定义
ARM嵌入式开发——Windows下CLion与OpenCV交叉编译环境搭建-番茄园【OpenCV】OpenCV源码编译并实现CUDA加速(Windows)-椒颜皮皮虾-博客园CMake编译OpenCV_4.10.0时,FFmpeg库编译失败_opencv4.10.0videoio-CSDN博客。
2024-12-09 17:45:53
415
原创 yolov5模型 训练,导出
教学视频:【目标检测 YOLOv5 开源代码项目调试与讲解实战【土堆 x 布尔艺数】】https://www.bilibili.com/video/BV1tf4y1t7ru?
2024-11-09 22:33:30
819
原创 Windows部署yolov5训练环境
你的Windows电脑没有显卡就不用看了。模型训练的时候是需要用到你的显卡的,一般都不会拿CPU去训练,如果你是第一次去做yolo训练模型的,你要做的有下面这些东西。虚拟环境的配置:安装conda配置或者使用Python配置CUDA安装和cdDNN(看本地显卡驱动支持的版本安装)安装Pytorch(看前面CUDA版本安装)推荐的相关教学视频。
2024-11-07 19:48:20
811
原创 Qt开发————网络编程
在局域网中,当一个计算机想要发送数据到另一台计算机时,它需要知道目标计算机的MAC地址。设备会通过ARP请求询问网络中的设备以找到目标IP地址对应的MAC地址,然后使用这个MAC地址将数据包发送到目标设备。(Media Access Control Address)是用于在局域网(LAN)中唯一标识网络接口设备的地址。它是在网络设备的硬件层面(如网卡)进行通信时使用的。是一个16位的数字,用于标识网络设备上运行的特定应用程序或服务。的设备上,HTTP服务运行在80号端口。有接收缓冲区,也有发送缓冲区。
2024-10-31 18:37:06
974
2
原创 Qt开发-----线程调度
以下引用内容源自正点原子Qt开发指南文档。我们写的一个应用程序,应用程序跑起来后一般情况下只有一个线程,但是可能也有特殊情况。比如我们前面章节写的例程都跑起来后只有一个线程,就是程序的主线程。线程内的操作都是顺序执行的。恩,顺序执行?试着想一下,我们的程序顺序执行,假设我们的用户界面点击有某个操作是比较耗时的。您会发现界面点击完了,点击界面对应的操作还没有完成,所以就会冻结界面,不能响应,直到操作完成后,才返回到正常的界面里。如果我们的界面是这么设计的话,估计用户得发毛了。
2024-10-23 21:45:29
923
原创 Qt开发————QPainter画图
当你想要自定义控件的外观或在窗口上绘制自定义图形时,需要重写paintEvent函数。在这个函数内部,你可以使用QPainter对象来绘制各种形状、文本、图像等内容。
2024-10-23 12:56:37
907
原创 Qt开发——Qt项目打包、整合以及生成安装包保姆级教程(Windows系统)
做完了一个Qt项目之后,要干嘛呢,很显然要打包给别人,让别人也能使用这个软件,本期我们就来学习Qt打包,本期内容分为Windows下和Linux下的打包封装,打包好的文件发给别人只需要点击执行就行了,就跟你下载了一个软件双击即可执行,这是作为开发者必备的打包能力,下面一起来学习吧!
2024-10-21 22:49:05
12051
3
原创 Qt开发-----布局控件(QHBoxLayout, QVBoxLayout, QGridLayout, QSplitter, QSpacerItem)
每个部件可以指定其所在的行和列,以及在行和列中跨越的数量(span)。是 Qt 框架中的一个用于管理多个窗口部件(widgets)显示区域的类,允许用户通过拖动分隔条来动态调整部件的大小。它通常用于在同一个窗口中创建可调整的多个区域,比如左右两栏或上下两个部分。是 Qt 中用于在布局中插入空白空间(类似于“弹簧”效果)的类。它可以占据布局中的一部分空间,并根据窗口大小动态调整自身的尺寸。通常用于让布局中的其他控件彼此分隔,或者让布局中的元素更灵活地响应窗口尺寸的变化。
2024-10-20 14:08:57
808
原创 Qt开发------容器控件(QWidget,QFrame、QMainWindow、QScrollArea)
是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己。这个函数是被子类重新实现的。这里至少还有两个有用的函数:drawFrame()之一是窗口可能重叠,使得一个窗口隐藏另一个窗口的一部分或全部。当两个窗口重叠时,它们的Z。是重叠二维对象的顺序,例如堆叠窗口管理器中的窗口。类是有框架的窗口部件的基类,它绘制框架并且调用一个。顺序确定哪个窗口出现在另一个窗口的顶部。类是所有用户界面对象的基类(如。都是矩形的,它们按照。
2024-10-20 13:28:58
803
原创 C++语法————智能指针(手动挡变自动挡 )
相较于前面手动挡控制内存的开辟和释放,C++这里有一个智能指针,可以在作用域实现内存的开辟和释放,实现了自动挡功能。C++ 中的是一种封装原始指针的类,用于自动管理动态分配的内存,确保在不再需要时自动释放内存,从而减少内存泄漏和悬空指针等问题。智能指针的主要类型包括和,它们分别提供了不同的内存管理策略。
2024-10-15 18:13:54
330
原创 C++语法————栈作用域生存周期
栈作用域中的变量在栈上分配内存,生命周期从进入作用域开始,到离开作用域时结束。栈上变量自动分配和释放内存,作用域结束后变量被销毁。返回局部栈变量的地址会导致未定义行为,应当避免。过深的递归或大量栈内存使用可能会导致栈溢出。
2024-10-15 16:48:21
1024
原创 c++语法————this指针
this指针指向调用当前成员函数的对象。this可用于区分成员变量和参数或局部变量,并可以返回对象自身以实现链式调用。在const成员函数中,this指针是指向常量对象的指针,确保成员函数不会修改对象的状态。
2024-10-15 15:50:45
307
原创 c++语法—————隐式转换+explicit关键字
加在构造函数的前面进行修饰,有了它就不会发生上面的这一系列事儿了,它会。而言,这里并不是将值直接赋值给到左边的对象,而是在。把它里面的值初始化为 1,然后再通过这个。,这就是编译器会做的一件事。,这个临时变量的类型是。
2024-10-15 14:22:22
514
原创 c++语法————构造函数成员列表初始化
在 C++ 中,成员列表初始化是一种用于初始化类成员变量的方式,通常在构造函数中使用。成员列表初始化的语法是在构造函数的参数列表之后,用冒号开始,后跟成员变量的初始化。
2024-10-14 21:35:51
233
原创 c++语法-----关键字mutable
mutable的主要用途是使得某些类的成员变量在const成员函数中可以被修改,这在某些情况下(如缓存、状态标记等)非常有用。
2024-10-14 20:42:03
295
原创 FreeRtos------信号量、互斥量和事件组
对于同一个变量,比如int a,如果有两个任务同时写它就有可能导致问题。对于变量的修改,C代码只有一条语句,比如:a=a+8;,它的内部实现分为3步:读出原值、修改、写入。比如对于串口,任务A正使用它来打印,在打印过程中任务B也来打印,客户看到的结果就是A、B的信息混杂在一起。在多任务系统中,任务A正在使用某个资源,还没用完的情况下任务B也来使用的话,就可能导致问题。各类操作函数,比如删除、give/take,跟一般是信号量是一样的。二进制信号量跟计数型的唯一差别,就是计数值的最大值被限定为1。
2024-10-08 16:58:20
943
原创 FreeRtos-----队列
跟读队列类似,一个任务要写队列时,如果队列满了,该任务也可以进入阻塞状态:还可以指定阻塞的时间。某个任务读队列时,如果队列没有数据,则该任务可以进入阻塞状态:还可以指定阻塞的时间。既然读取队列的任务个数没有限制,那么当多个任务读取空队列时,这些任务都会进入阻塞状态:有多个任务在等待同一个队列的数据。既然写队列的任务个数没有限制,那么当多个任务写"满队列"时,这些任务都会进入阻塞状态:有多个任务在等待同一个队列的空间。队列(queue)可以用于"任务到任务"、"任务到中断"、"中断到任务"直接传输信息。
2024-09-30 19:18:22
795
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人