自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 《Linux C编程实战》笔记:共享内存

由于本人要考研了,播客可能不会再长更。这本《Linux C编程实战》其实也差不多完结了,还剩网络编程章节没有讲,我肯定是没时间讲了,可能考研失败了会回来继续。《Primer C++》的课后题还有第八章的存货,后续章节只能随缘更新。Qt部分真烂尾了,写Qt项目的注释实在太累了。最有可能更新的部分是力扣题讲解,因为写来准备复试上机。最后祝大家,也祝我一切顺利。

2024-03-02 14:35:15 1200 1

原创 cuda编程笔记(3)--常量\设备内存与事件

是 CUDA 中用于的关键字,其作用是在设备的。1.声明常量变量(在全局作用域)注意:这声明了一个存放在 GPU 常量内存上的全局整型数组constData,不可在设备代码中修改。2.在主机端初始化常量内存⚠️ 使用是唯一向内存赋值的方式。不能直接写。对比其他类型__device____shared__完整示例代码。

2025-06-12 21:43:29 522

原创 《Linux C编程实战》笔记番外:如何避免子进程成为僵尸进程

wait()waitpid()在这种情况下,子进程的,以便父进程将来可以获取其退出状态。这个进程已经“死了”,但还在操作系统中“留个壳子”,这就是“僵尸”。🔍 具体过程:子进程调用exit()或正常返回结束;内核将其状态设为ZOMBIE(僵尸);等待父进程来调用wait()或waitpid();父进程调用wait()后,内核清理子进程的 PCB(进程控制块),从而完全释放其资源。

2025-06-11 16:32:04 468

原创 《Linux C编程实战》笔记:多路复用

nfdsreadfdswritefdsexceptfdstimeoutnullptrtimeval在设置为{0, 0}:立即返回,不等待(轮询)设置为{5, 0}:等待 5 秒设置为nullptr它本质上是一个,最多能表示FD_SETSIZE个文件描述符。通常,也就是说最多能监听 1024 个 fd。select函数的功能相当于:当套接字上有事件发生时(如有数据到达),系统通知服务器进程告知哪个套接字上发生了什么事,服务器进程查询对应套接字并进行处理。

2025-06-03 15:28:23 705

原创 《Linux C编程实战》笔记:套接字编程

socket()创建 socketbind()绑定 IP+端口listen()设置监听状态accept()接受客户端连接并获得新 socket。

2025-05-30 14:31:55 1152

原创 为什么std::bind,std::thread传递引用时需要std::ref?如何自己实现一个简易的Myref?

这么做的好处在于MyWrapper对象的拷贝并不会修改它保存的指针,也就是一直指向i的那部分,在std:bind内部,_Args只是MyWrapper对象在传递,不管MyWrapper是否被去除引用,被不停拷贝,最终还是会执行f(MyWrapper 对象),结果和上面的例子自然是一样的,i能够被改变。于是_Mypair里的参数类型就是普通值,所以_Mypair里的i与我们传递的i是完全不同的副本,最后调用的f(i)修改的也并不是我们传递的i。最终i还是0,并不会改变i的值;

2025-05-30 11:37:50 188

原创 cuda编程笔记(2)--传递参数、设备属性

int aint b:两个通过值传递的整型参数。int *c:一个指针,指向 GPU 设备内存,用于返回结果。cudaMalloc。

2025-05-28 21:32:16 779 1

原创 CUDA编程笔记(1)--最简单的核函数

_global__ void kernel_name(parameter_list) { // GPU 上执行的代码 }__global__在 GPU 上执行由 CPU 主机代码调用:核函数的名称。:参数列表,可以传递普通数据指针(如设备内存地址)或标量值。元素用法示例定义方式启动语法内置索引变量blockIdxthreadIdxblockDimgridDim索引计算输出方式printf()同步函数。

2025-05-26 22:04:37 832

原创 使用CRTP实现单例

CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是一种在 C++ 中广泛使用的设计模式,利用了模板的特性来实现静态多态。它是一种静态多态的实现方式,不同于传统的动态多态(基于虚函数的多态)。CRTP 模式的核心思想是:类Derived作为模板参数传递给基类Base,使得基类能够访问派生类的成员或调用派生类的函数,而不需要使用虚函数。通过这种方式,基类在编译时就能知道派生类的类型,从而实现静态多态。下面以动物类为例子,说明CRTP如何实现静态多态。

2025-05-25 17:24:59 705

原创 《C++ Templates》:有关const、引用、指针的一些函数模板实参推导的例子

这种情况,T是int类型这种情况,T还是int类型这种情况,T还是int类型这种情况,T是int *而这种情况,T还是int * (因为int *const p的意思是p是一个指向int类型的指针,而且指针p的值不能改变,故该const是顶层const)故这种情况下T是const int *(int const *)类型顺便提一下,这种情况T依然是const int *,因为T是不会推导出引用的。

2025-05-07 22:44:41 493

原创 新版pycharm如何实现debug调试需要参数的python文件

脚本形参填入参数,如:--arg1 value1 --arg2 value2。最后给文件打上断点,再点击调试按键,就可以调试了。script选择你要调试的python文件。

2025-04-05 20:53:03 262

原创 最新版pycharm如何配置conda环境

注意,conda的路径是你安装的conda的Scripts里的conda.exe;图片里环境显示是默认的,你应该选择刚刚新建myenv。首先在conda prompt里创建虚拟环境,比如。往里面安装点自己的包,比如。

2025-01-22 22:27:21 789 1

原创 力扣34. 在排序数组中查找元素的第一个和最后一个位置(经典二分)

我们如今已经找到了起始位置start,是满足nums[start]>=target的第一个点,我们是根据nums[start-1]<target原理找到的;寻找位置end也可利用nums[end+1]>target的性质,我们去寻找target+1在nums数组中的起始位置,减一即为end。此时left=3,确保了[0,left)区域所有元素小于target,那么[left,n-1]区域的元素自然大于等于target,而left也是题目要求的起始位置。以[5,7,7,8,8,10]为例。

2025-01-13 17:45:32 729

原创 Q_OBJECT宏报错的问题

根据网上的大神的做法,在.pro文件里随便加个空格,点击保存再重新编译,问题就解决了。实操一下确实,故在此记录。

2025-01-12 22:13:47 292

原创 最长连续公共子串

输入两个字符串 s1,s2。输出最长连续公共子串长度和最长连续公共子串。输入格式 一行,两个字符串 s1,s2 ,用空格隔开。输出格式 第一行输出最长连续公共子串的长度 第二行输出最长连续公共子串。如果不唯一,则输出 s1 中的最后一个。数据范围 1≤|s1|,|s2|≤100数据保证至少存在一个连续公共子串。输入样例: abcdefg qwercdefiok输出样例:4cdef1.暴力枚举枚举所有可能的长度,对比s1内所有该长度len的子串与s2中所有len长度的子串是否有相等的。

2025-01-10 10:39:38 625

原创 差分原理+练习

比如sub数组里的正数总和为6,负数总和为-4,那么经过4次操作,最后正数总和为2,负数总和为0,这种情况比如:{2,2,2,3,4}这时候再操作两次,就可以让sub数组的元素归0(sub[1]除外)(实际上最后的操作让sub[1]+=1,但是sub[1]在本题无意义,它不能反应工资是否相同)观察sub数组,题目提到一次操作可以使区间内的所有a都加1或减1,也即通过一次对[l,r]的操作,可以让sub[l]+=1且sub[r+1]-=1(也可能反之)最终的效果是sub[1]+=1,sub[4]-=1;

2024-06-06 22:47:38 1070

原创 单调栈原理+练习

首先用一道题引出单调栈首先画一个图演示山的情况:最暴力的做法自然是O(n方)的双循环遍历,这么做的思想是求出当前山右侧有多少座比它小的山,遇见第一个高度大于等于它的就停止。但是对于我们所求的答案数,可以换一个想法,对于5;7可以看到它。对于3;7,5可以看到它。对于4;7,5可以看到它。可以发现,即求左侧有多少比当前值大的山的个数,那么我们可以维护一个数据结构,使得每次加进来一个数,都保持递减的顺序,然后每次加入前,都计算它的size大小,进行累加。比如:一开始7进入;

2024-06-01 22:19:25 789

原创 力扣204.计数质数(线性筛)

假设不中断,对于i*primes[j+1]这个合数,它被primes[j+1]这个质数标记.但实际上,它的最小质数因该是primes[j],因为当i' =(i/primes[j])*primes[j+1]时,i' *primes[j]==i*primes[j+1],可知它因该被primes[j]这个质数标记。线性筛我之前的题解已经涉及到,但是讲的实在太差了我自己回看都看不懂,于是通过这道题重新回顾线性筛。(p,q等都是质因数,n,m是指数),其中一定会有一个最小的质数,我们的目的是要标记一个合数。

2024-05-17 21:55:10 318

原创 力扣207.课程表

我们知道拓扑排序可以用来判断是否有环路,不过仅仅是判断环路也可以直接用dfs,不需要完全写出拓扑排序,毕竟拓扑排序相比dfs还是更复杂一些。如果是有环图,可以自己试一下,最后图里会剩下环,因为环上所有节点的入度都不为0,因此不会入栈。从0出发,进行一次dfs,假设路径是0-1-3-4,那么最后1,3,4会变成红色,0还是蓝色。最终,4个节点全部入了栈,因此cnt==n成立,该图是无环有向图。一开始只有0的度为0,所以0入栈,出栈时会执行这一段代码。那么就把从0开始的弧都删掉,并把弧所指向的节点的入度减1。

2024-04-08 15:37:02 482 2

原创 力扣323.无向图中连通分量的数目(dfs/bfs)

失败版,这是我最开始写出来的bfs代码,不过超时了,原因应该是遍历edges太费时了,因为edges存的时候是无序的,要找到我需要的节点就要遍历整个容器。所以改进的话就再建个邻接矩阵,这样找临边就方便许多。这道题按理说是一眼并查集的,不过深搜广搜也可以做。所以dfs也得加邻接矩阵。

2024-03-17 11:36:38 477

原创 《Primer C++》第五版习题:第八章

cin流的状态处于错误,比如eofbit,badbit,failbit。记得保存好自己的Sales_data,因为这本书可惦记这个类了。因为需要的是一个聚合类,所以不应该使用类内初始化。因为我们不会修改它们,所以定义成const。

2024-03-04 17:09:39 320

原创 《Primer C++》第五版习题:第七章

如果不加引用,第一次对myScreen的操作其实是对其一个副本的操作,myScreen的内容并没有改变,所以两次显示的内容不同且第二次display的还是原来myScreen的内容。:静态成员与类的实例无关,它们与类本身密切相关。友元能够访问被声明为私有的类成员,这在某些特殊情况下是有用的,例如提供更高效的实现或解决特定的设计问题。:静态成员被类的所有实例共享,因此它们可以用来表示属于类的数据或状态,而不是特定于类的实例。:静态成员的生命周期与程序的生命周期相同,而普通成员的生命周期与所属的类的实例相关。

2024-02-26 16:54:26 967

原创 《Linux C编程实战》笔记:信号量

信号量在操作系统的书里一般都有介绍,这里就只写书上说的了。信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的资源可以是一段代码、一个变量或某种硬件资源。信号量的值大于或等于0时表示可供并发进程使用的资源实体数;小于0时代表正在等待使用临界资源的进程数。与消息队列类似,Linux内核也为每个信号量集维护了一个semid_ds数据结构示例。该结构定义在头文件linux/sem.h中。

2024-02-23 19:58:25 1160

原创 《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中,只有在内核重启(即操作系统重启)或显示地删除一个消息队列时,该消息队列才会被真正的删除。操作消息队列时,需要用到一些数据结构,熟悉这些数据结构是掌握消息队列的关键。下面介绍几个重要的数据结构。

2024-02-21 21:52:40 970

原创 《Linux C编程实战》笔记:有名管道

管道的一个问题就是没有名字,因此只能用于有亲缘关系的进程间通信。有名管道(named pipe或FIFO)它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。有名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。Linux下有两种方法创建有名管道。一是在Shell下交互地建立一个有名管道。或者是在程序里用函数。

2024-02-03 13:44:54 705

原创 《Linux C编程实战》笔记:管道

从这节开始涉及进程间的通信,本节是管道。管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称之为半双工管道。。管道的这一特点决定了其使用的局限性。除了以上局限性,管道还有一些不足。例如管道没有名字,管道的缓冲区大小是受限制的,管道所传送的是无格式的字节流。这就要求管道的输入方和输出方事先约定好数据的格式。虽然有这么多不足,但对于一些简单的进程间的通信,管道还是可以胜任的。使用管道进行通信时,两端的进程向管道读写数据是通过创建管道时,系统设置的文件描述符进行的。

2024-01-29 17:11:43 1295

原创 《Linux C编程实战》笔记:信号应用于事件通知

第二种:用pause挂起,等待信号的触发,事件发生时向进程发送信号,对应的信号处理函数改变全局变量的值,信号处理函数返回后进程检测该全局变量,满足要求即可直到事件已发生。实际应用中,进程可能需要等待某一事件的发生,一般可以通过检测某一全局变量来判断事件是否发生。有三种方法可以实现这一要求。第一种:程序不停循环检测全局变量,这样可以满足要求,但是非常占用cpu资源。第三种:原理和第二种一致,不过使用的函数是sigsuspend。

2024-01-27 15:56:13 431

原创 《Linux C编程实战》笔记:信号的发送与处理实例

我已经演示过使用sigqueue发送数据了。本节是书上使用sigqueue发送数据的例子。本节只有代码演示和讲解。演示如何利用信号来实现数据的传递,不过在。那么直接看代码吧,首先是发送方的程序。

2024-01-26 17:50:08 316

原创 《Linux C编程实战》笔记:信号的屏蔽

在的sigaction的sa_mask成员,它的类型就是一个信号集,下面我们来介绍它。

2024-01-25 15:19:28 1056

原创 《Primer C++》第五版习题:第三章

如果写成for(char &c:str)的话,结果是一样的;不过不加&只是char c,也就不是引用的话就不对了,这样的话str是没有变化的。getiline会读入空白字符,但是最后会把它丢弃,不会存到string里去。(c)正确,是一个字符串的容器,里面有10个元素,都是"null"我就不一个一个容器的输出了,写一个函数吧,把容器传过来然后就输出。不合法,ivec是一个空的容器,还没有第一个元素。后面的内容都是C里面的数组了,我的评价是略过。(g) 10个"hi"字符串。(a)正确,是一个空的容器。

2024-01-24 19:20:32 405

原创 《Linux C编程实战》笔记:信号的发送

信号的发送主要由函数kill、raise、sigqueue、alarm、setitimer以及abort来完成。

2024-01-23 20:20:32 1246

原创 《Linux C编程实战》笔记:信号处理函数的返回

信号处理函数可以正常返回,也可以调用其他函数返回到程序的主函数中,而不是从处理程序返回。

2024-01-21 13:41:44 1141

原创 《Linux C编程实战》笔记:信号的捕捉和处理

Linux系统中对信号的处理主要由signal和sigaction函数来完成,另外还会介绍一个函数pause,它可以用来相应任何信号,不过不做任何处理。

2024-01-20 20:12:01 1334

原创 《Linux C编程实战》笔记:Linux信号介绍

信号是一种软件中断,它提供了处理一种异步事件的方法,也是进程惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展的信号机制,不仅可以用来通知某进程发生了什么事,还可以给进程传递数据。

2024-01-19 17:15:23 1007

原创 《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章,按理说应该在前面就讲了头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误的信息程序开始执行时,变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会将errno设置为相应的错误码。函数被成功调用时,它们不修改errno的值。因此,当一个函数被成功调用,errno的值可能不为零,它的非零值由前面的函数设置。所以不能根据errno的值来判断一 个函数执行是否成功。

2024-01-17 18:54:32 1351

原创 《Linux C编程实战》笔记:线程同步

这一节主要是解决共享资源的处理。操作系统里也讲过互斥、锁之类的概念。

2024-01-13 16:59:51 1277

原创 《Linux C编程实战》笔记:线程私有数据

在多线程环境下,进程内的所有线程共享进程的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部有效。如常见的变量errno,它返回标准的出错代码。errno不应该是一个局部变量,几乎每个函数都应该可以访问它;但它又不能作为是一个全局变量,否则在一个线程 里输出的很可能是另一个线程的出错信息,这个问题可以通过创建线程的私有数据(Thread-specific Data,或TSD)来解决。

2024-01-10 15:19:23 555

原创 《Linux C编程实战》笔记:线程终止

Linux 下有两种方式可以使线程终止,一种是通过return从线程函数返回,第二种是通过调用pthread_exit()使线程退出是一个线程库中的函数,用于终止调用线程。调用将会终止当前线程,并将retval的值传递给等待该线程的任何调用的线程。如果线程没有被任何其他线程等待,它的资源将会在终止时被释放。有两种特殊情况要注意:一种情况是, 在主线程中,如果从main函数返回或是调用了exit函数退出主线程,则整个进程将终止,此时进程中所有线程也将终止,因此在主线程中不能过早地从main函数返回。

2024-01-09 15:12:03 682

原创 《Linux C编程实战》笔记:创建线程

上一章是进程,这一章是线程有关线程进程的概念之类的请自行学操作系统吧,书里都是偏实战应用的。

2024-01-04 23:31:56 1108

原创 《Linux C编程实战》笔记:实现自己的myshell

ok,考完试成功复活这次是自己的shell命令程序的示例。

2024-01-03 18:51:05 1273

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除