自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 贪心算法(六)

首先,对数组进行排序,但是要重写一下排序规则:如果两个区间的左端点不相等,按照左端点从小到大进行排序,如果两个区间的左端点相等,按照左端点从大到小进行排序。但是,设字符串s大小为n,如果s中出现次数最多的字符的次数大于(n+1)/ 2,那么无论怎样放置,都无法得到想要的结果。进行模拟,每次将同一类元素全部处理,即如果元素1出现的次数最多,那么就将所有的元素1放置好,再去放置其他元素。先将出现次数最多的元素,从第一个位置开始,进行放置, 然后隔一个位置放置。2、奇数的二进制表示的最后一位是1。

2025-01-24 11:34:51 634

原创 贪心算法(五)

根据题目,我们可以知道:在几个区间中,如果这些区间两两相互重叠,那么说明它们有公共部分,那么我们就可以用一支箭将他们全部引爆。再进一步思索,这些区间有公共部分,那就说明它们的交集是不为空的。换句话说,就是要保留尽量多的区间,使这些区间没有重叠部分。排序后,我们能够保证有重叠部分的区间一定是连续的,是挨在一起的。排序后,我们能够保证有重叠部分的区间一定是连续的,是挨在一起的。排序后,我们能够保证能够合并的区间一定是连续的,挨在一起的。所以说,这道题就是找出所有互相重叠的区间,也就是求区间的交集。

2025-01-09 13:17:28 870

原创 贪心算法(四)

如果 g[p1] > s[p2],说明相应位置的饼干不能够满足对应位置的孩子的胃口。根据上图,我们可以分析:从棕色方框位置起跳,可以到达红色方框中的某一个数;从黄色方框位置的某一个数起跳,可以到达绿色方框的某一个数。~ 如果 g[p1] <= s[p2],说明相应位置的饼干能够满足对应位置的孩子的胃口,满足的孩子数加1。从棕色方框起跳到红色方框,再从红色方框跳到黄色方框,最后从黄色方框跳动绿色方框。这道题的贪心策略和上一道题,跳跃游戏II 的贪心策略一模一样,只是题目要求的返回结果不一样。

2024-12-31 16:43:06 950 3

原创 贪心算法(三)

而孙膑给田忌出了个注意:田忌的下等马对齐王的上等马,中等马对下等马,上等马对中等马。这样,虽然齐王的上等马对田忌的下等马是场碾压式的胜利,可是另外两场,田忌都可以获胜。总的来说,就是田忌获胜了。贪心策略对于田忌赛马的思想运用,就是对于同一位置来说,如果nums1的值小于nums2的值, 那么我们就拿nums1的值去匹配nums2中没有被匹配元素的最大元素。赛马的要求就是:上等马对上等马,中等马对中等马,下等马对下等马。因为齐王的上中下等马,都依次比田忌的上中下等马好一些,所以无论怎么比,田忌都无法获胜。

2024-12-24 17:04:06 2177 2

原创 贪心算法(二)

扫描到101的时候,101可以接在2的后面,也可以接在3的后面,也可以接在7的后面,因为要找最长的递增序列,所以将101放在7的后面,形成长度为4的递增序列。扫描到18的时候,18可以接在2的后面,也可以接在3的后面,也可以接在7的后面,但无法接在101的后面,所以递增序列长度为4时,最后位置的元素存较小的18。如下图,我们只要找到所有能够获得正收益的一段,就可以将其利润算上。扫描到7的时候,7可以接在2的后面,也可以接在3的后面,因为要找最长的递增序列,所以将7放在3的后面,形成长度为3的递增序列。

2024-12-16 12:01:41 1057 3

原创 贪心算法(一)

此时来了一个顾客,支付了20元,如果选择第一种对于20元的找零方法,那么找零后,手里就剩了一张20元和一张10元的,然后又来了一个顾客,支付10元,那么此时就无法找零了。所以说,对于一个元素,如果用该元素减去它前面一个的元素得到的差值与用它后面的元素减去它自己得到的差值,相乘是负数,就说明该元素处于波峰或者波谷,那么这个元素就属于最长摆动序列的一员,统计长度时就要算上它。根据题目分析,我们最终的目的是将数组的元素按照一定的规则,按顺序放置,也就是对元素进行排序,就得到元素组成的整数是最大的。

2024-12-10 17:15:36 3991 10

原创 动态规划——二维费用的背包问题

dp[i][j][k]:表示从前 i 个字符串中选,字符 ‘0’ 的个数不超过 j,字符 ‘1’ 的个数不超过 k 时,所有的选法中,长度最大的子集的长度。dp[i][j][k]:从前 i 个工作中选,完成这些工作的人数不超过 j,所获的利润至少为 k 时,一共有多少种选法。我们这里只需要初始化没有任务的情况,即:i == 0。dp[i]:表示结点个数为 i 的个时候,一共有多少种二叉搜索树。所以我们需要初始化 dp[0][j][0] == 1。dp[i]:表示凑成总和为 i,一共有多少种排列数。

2024-11-25 12:42:00 517 19

原创 动态规划——完全背包问题

题目要求选出的物品中,总体积要恰好为 j ,那么就有可能怎么选也凑不出物品的总体积恰好为 j 的情况,那么我们就不能使用这种情况,可以用 dp[i][j] == -1 来表示凑不出物品的总体积恰好为 j 的情况,即这种情况不存在。选n个 i 物品,这时就有n个v[i]的体积了,然后仅需去 1 ~ i - 1 区间选不超过 j - n*v[i] 的最大价值,然后再加上n个 i 的价值。dp[i][j]:表示从前 i 个物品中挑选,总体积恰好为 j 的所有选法中,能挑选出来的物品价值最大值。

2024-11-18 11:53:37 1238 24

原创 动态规划——01背包问题

最后一块石头的重量II题目解析这道题如果直接用动态规划去做是很难的。状态表示定义不出来。所以我们先分析这道题看能不能把这道题转换一下。我们先模拟一下选择过程:最后,数组中剩下的元素就是我们想要的结果。我们发现,这和上一道题目标和好像有些像, 最后的结果也是在元素前面添上正号或者负号而得到的,那就相当于把一个元素变成正数或者负数。这样数组就会只剩下一个元素了。这道题是让我们求剩下的石头的最小重量,所以这道题我们就可以转换成:在数组中选择一些数,让这些数的和尽可能的接近 sum / 2。

2024-11-11 10:03:52 1863 16

原创 动态规划——两个数组的dp问题

dp[i][j]:表示字符串 s1 的 [0,i] 区间以及字符串 s2 的 [0,j] 区间内的所有公共子序列中, ASCII值最大和。dp[i][j]:表示字符串 s1 的 [0,i] 区间以及字符串 s2 的[0,j] 区间内所有子序列中,最长公共子序列的长度。dp[i][j]:表示s1[1,i]区间内的字符串和s2[1,j]区间内的字符串能不能拼成s3[1,i+j]区间内的字符串。dp[i][j]:表示s字符串 [0,i]区间内所有子序列中,有多少个t字符串 [0,j] 区间内的子串。

2024-11-03 09:52:26 1082 20

原创 动态规划——回文串问题

如果 [0,i] 区间 中有一个位置 j 切割出来一个 [j,i] 的子串,如果[j,i] 是一个回文串,接下来在 [0,j-1] 看看切割少次,然后再加上切出来的[j,i] 这一次就可以了。填表顺序:在求dp[i][j] 的值时,我们需要用到 dp[i+1][j-1]位置的值,所以需要从下往上,从左往右依次填写dp表。dp[i][j]表示字符串s里面 [i,j] 区间内的子串,使它成为回文串的最小插入次数,而我们要的是整个区间的最小插入次数,因此返回 dp[0][m-1]

2024-10-25 09:37:30 1290 28

原创 动态规划——子序列问题

比如上面示例2,如果 i 位置元素是11,那么它的前面可以是1,3,7等等,无法确定它前面具体是哪一个元素。dp[i][j]:表示以 i 位置元素和 j 位置元素为结尾的最长的斐波那契子序列的长度。(其中规定i < j)。f[i]:表示以 i 位置元素为结尾的所有子序列中,最后一个位置呈现上升趋势的最长摆动序列的长度。g[i]:表示以 i 位置元素为结尾的所有子序列中,最后一个位置呈现下降趋势的最长摆动序列的长度。显然是不能的,因为它的公差是不能确定的,我们至少需要两个数才能确定公差,进而去推出其他的数。

2024-10-21 12:00:21 2169 29

原创 动态规划——子数组问题

然后如果 i 位置元素s[i - 1] == s[i] || (s[i - 1] == z && s[i] ==a)说明以 i 位置结束的字符串也在base中出现了,出现次数是dp[i - 1]。如果 i,i-1,i-2 位置元素能构成一个等差数列,那就是在以 i-1,i-2 位置元素为结尾的等差数列后面在加一个 i 位置元素,这些数列也是构成一个等差数列,以 i-1,i-2 位置元素为结尾就相当于以 i-1 位置元素为结尾,而以 i-1 位置元素为结尾的等差数列的个数,就在dp[i-1]里存着。

2024-10-16 12:13:33 1711 22

原创 动态规划——多状态动态规划问题

我们在使用状态转移方程时,会用到 i-1位置的值,那么如果 i 为0的话,就会有越界访问的问题,所以我们需要初始化,f[0] = nums[0],g[i] = 0。如果第 i - 1 天结束处于冷冻期,也就是说第 i 天不能进行任何操作,无法购买股票,当第 i 天结束后,就会结束冷冻期,进入卖出状态。所以,f[i]:表示第 i 天结束后,处于买入状态时,所获的最大利润。根据题意和示例,大的状态表示就是在第i天结束后,所获得的最大利润,而对于第i天来说,我们又有三种可能的状态:卖出,买入,冷冻期。

2024-10-12 11:49:05 1429 23

原创 动态规划——简单的动态规划问题

‌‌动态规划算法(Dynamic Programming,DP)是‌运筹学的一个分支,用于求解决策过程的最优化问题‌。它通过将复杂问题分解为多个子问题,并存储子问题的解,以避免重复计算,从而提高效率。使用动态规划算法解决问题的步骤:1、确定状态表示2、推出状态转移方程3、建立dp表,并初始化4、确定填表顺序后,编写代码5、最后根据题意和状态表示,返回结果。

2024-10-08 10:18:36 1470 19

原创 MySQL之复合查询与内外连接

前面我们讲解的mysql表的查询都是对一张表进行查询,即数据的查询都是在某一时刻对一个表进行操作的。而在实际开发中,我们往往还需要对多个表同时进行查询。我们这里使用的测试表,为雇员信息表(来自Oracle 9i的经典测试表):EMP员工表,DEPT部门表,SALGRADE工资等级表。

2024-09-30 09:09:52 1672 7

原创 MySQL之内置函数

该函数的作用是获取datetime参数的日期部分,也就是对于 年-月-日-时-分-秒 的格式,该函数可以把其转换成 年-月-日 的格式。md5函数的作用是对一个字符串进行md5摘要,如下:无论是多长的字符串,摘要后得到的字符串都是32位的字符串。同样的,如果在date_sub函数中减去的日期/时间为负值,则相当于在日期的基础上添加日期/时间。该函数的作用是获取当前的时间戳,也就是年-月-日-时-分-秒的格式,以日期时间格式进行显示。datediff函数的作用是获取两个日期的差(前者减去后者),单位是天。

2024-09-26 17:38:18 1134

原创 MySQL之基本查询(二)(update || delete || 聚合函数 || group by)

首先,我们分析一下需求,我们需要的数据是平均工资和最低工资,这个可以使用函数avg和min,来实现。2、实际上 TRUNCATE 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事务,所以无法回滚。首先,创建一个雇员信息表(来自Oracle 9i的经典测试表):EMP员工表,DEPT部门表,SALGRADE工资等级表。分组的目的是为了进行分组之后,方便进行聚合统计。然后,我们需要根据分组聚合的结果,进行筛选,显示平均工资低于2000的部门和它的平均工资。

2024-09-23 19:40:25 1282 1

原创 MySQL之基本查询(一)(insert || select)

而我们对数据库的操作一般来说也就是四个操作,CRUD : Create(创建,增), Retrieve(读取,查),Update(更新,改),Delete(删除,删)。通常情况下不建议使用 * 进行全列查询:1、一张表一定是拥有大量的数据的,查询的列越多,意味着需要传输的数据量越大。我们在进行数据插入时,由于主键或者唯一键对应的值已经存在而导致插入失败,此时有了主键或者唯一键的冲突,我们可以考虑对表中的值进行更新。在查询时,我们可以将 * 换成我们想要查询的若干个列的名称,以进行指定列查询。

2024-09-23 19:39:45 2550 16

原创 MySQL之表的约束

比如,在学校中,一个学生一定有其所在的班级,且不能为空,因为某个学生一定是属于一个确定的班级的,并且这个班级所在的教室也是确定的且不能为空,不然学生就不知道在哪里上课了。这里面显示的宽度是5。加了zerofill约束后,这次可以看到b的值由原来的2变成00002,这就是zerofill约束的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。因为数据类型有自己的大小,也就是我们插入的数据是有范围的,不能够随意插入,这就对程序员的插入操作作了规范和约束,保证了插入的数据的合法性和完整性以及可预期性。

2024-09-19 19:00:08 959 21

原创 MySQL之数据类型

我们发现,如果用户插入了不在数据类型指定范围的数据,即不合法的数据,MySQL一般都会直接拦截我们并报错,不让用户进行插入。从上面的结果中,我们发现,插入一个字符和两个字符都是可以行的,但是当插入三个字符就会出错。从上面的结果,我们可以得出一个结论:对于小数来说,MySQL会对超出位数的小数进行四舍五入,如果四舍五入的结果合法,也是可以插入的。我们创建一个表,来表示用户的在线状况。出于效率考虑,这些选项实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个。

2024-09-10 12:40:56 1959 19

原创 MySQL之对数据库和表的操作

再来看看下面test2(使用utf8_ bin校验规则)数据库中的我们根据name的排序结果:因为其区分大小写且小写字母的ascii码大于大写字母,所以会得到下面的结果。从上面的结果中,我们可以发现,在select查询中,utf8_ general_ ci是不会区分大小写的,而utf8_ bin是会区分大小写的。注:如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建一个数据库,然后使用数据库,再使用source来还原。一般来说,我们对数据库的修改主要是修改数据库的字符集和校验规则。

2024-09-06 10:57:33 1502 26

原创 MySQL之数据库基础

总结来说,一般的文件确实提供了数据的存储功能,但是却没有提供非常好的数据管理能力,也就是说,如果程序员要对文件中的数据进行读取,修改,条件筛选的时候,就需要自己通过对文件操作的代码进行操作。而如果有了数据库,当我们需要对数据进行读取,修改,条件筛选的时候,我们只需要给数据库服务提供字段或者要求,数据库就可以直接返回我们想要的结果。我们发现,数据库,本质就是Linux的/var/lib/mysql/ 路径下的一个目录,我们创建一个数据库,就是在/var/lib/mysql/ 路径下创建一个新的目录。

2024-09-02 19:46:05 1598 24

原创 DNS协议 | NAT技术 | 代理服务器

全局IP要求唯一,但是私有IP不需要,在不同的局域网中出现相同的私有IP是完全不影响的。反向代理服务器,也是一个位于客户端和目标服务器之间的服务器,客户端向抖音服务器发起数据请求时,由反向代理服务器将客户端的数据请求收集起来,再由其推送给真正的后端目标服务器进行处理,数据处理完毕后抖音服务器再将数据结果直接返回给客户端。正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端。

2024-06-10 09:56:41 1635 39

原创 数据链路层协议——以太网协议

当ARP层收到这个数据包后,发现ARP数据包当中的op字段为1,于是判定这是一个ARP请求,然后再提取出ARP数据包当中的目的IP地址字段,虽然局域网当中的所有主机都会将该数据包交给自己的ARP层,但最终只有主机B发现ARP数据包当中的目的IP地址与自己相同,因此只有主机B会对该ARP请求进行应答,而局域网当中的其他主机在识别到ARP数据包当中的目的IP地址与自己不匹配后,就会直接将这个ARP请求报文丢弃。当然是不行的,因为一个局域网中就有大量的主机,主机数量可比局域网多多了,这样维护成本就太大了。

2024-05-29 10:15:58 1528 32

原创 网络层协议——IP协议

假设欧洲的某个用户发送了一个消息给中国四川的某个用户,其目的IP是 0011 0111 ......,将其与路由器的子网掩码 1111 0000 ........,进行按位与,得到 0011 0000 ......,一查路由表,发现是中国,就转发给中国网段的路由器所在的子网。然后根据偏移量排序,偏移量为0的是报文开始,然后偏移量加上自身大小为1000,说明下一个分片的偏移量是1000,找到中间部分分片,接着,中间部分的分片偏移量加上自身大小为1500,说明下一个分片的偏移量为1500。

2024-05-25 09:50:17 1766 38

原创 传输层协议——TCP协议

TCP协议既要保证可靠性,同时又尽可能的提高通信效率。可靠性:检验和。序列号。确认应答。超时重传。连接管理。流量控制。拥塞控制。提高效率:滑动窗口。快重传。延迟应答。捎带应答。

2024-05-16 09:50:01 1232 40

原创 传输层协议——UDP协议

当主机从网络中获取到数据后,需要自底向上进行数据的交付,而这个数据最终应该交给上层的哪个应用软件进程,就是由该数据当中的目的端口号来决定的。因为最终我们需要将数据交给应用层,而且是通过传输层将最终数据交给应用层的,所以传输层必定能够提取出相应的端口号,从而知道应该将数据交付给应用层的哪一个进程。在传输层,将报头和有效载荷分开后,提取出报头中的16位UDP长度,用其减去报头固定长度8字节,就是有效载荷的大小。比如HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的。

2024-05-10 10:11:38 1415 36

原创 应用层协议——http协议和https协议

通常我们程序员在网络编程的时候,一般是处于应用层的。而我们的http和https协议就是典型的应用层协议。

2024-05-06 09:19:45 1661 39

原创 协议的定制之序列化与反序列化 | 守护进程

a,+,b三个数据组成一组结构化的数据,我们首先想到使用一个结构体将三个数据打包,一起发送给服务器,而我们所用的各种通信函数只允许我们传输字符串,所以我们必须要将结构化的数据先转化成字符串,然后才能发送给服务器。对于网络计算器的客户端,我们使用一个结构体去存储左右操作数和操作符,这个结构体我们称为请求(Request),在向服务端发送请求的时候,我们需要转成字符串才能发送,于是我们需要有序列化的函数,当然,收到结果后,我们也需要反序列化函数,将字符串结果转成结构化结果。所以说,守护进程也是一种孤儿进程。

2024-04-22 12:30:04 1208 51

原创 网络编程套接字(三)之TCP服务器简单实现

所以我们发现,当其中一个客户端在和服务器进行通信的时候,另一个客户端并不能与服务器通信,也就是说服务器在某一时刻只能向一个客户端提供服务,只有对一个客户端提供服务完成后,才能对下一个服务器提供服务。第一步,创建套接字使用的函数和UDP完全一样,只不过我们需要把socket的第二个参数由基于数据报的SOCK_DGRAM 更改为基于字节流式的SOCK_STREAM,SOCK_STREAM提供的就是一个有序的、可靠的、全双工的、基于连接的流式服务。而服务器首先需要做的就是进行监听,等待客户端的连接。

2024-04-19 10:00:00 2206 46

原创 网络编程套接字(二)之UDP服务器简单实现

注:实际上,一款网络服务器不建议指明一个IP,也就是不要显示地绑定IP,因为一个服务器上可能会有多张网卡,所以IP可能不止一个,如果只绑定一个明确的IP,最终的数据可能用别的IP来访问端口号,这就无法访问,所以真实的服务器IP一般采用INADDR_ANY(全0,任意地址)代表任意地址bind。首先,我们在该文件中,将服务器封装成一个类,而作为一款服务器,必须要有自己的端口号,同时网络服务器需要有对应的IP地址,文件描述符sock_:进行各种各样的数据通信,在类内进行读写操作。

2024-04-15 09:14:04 3999 49

原创 网络编程套接字(一)

因为在现在的互联网世界,每台主机的IP地址都是唯一的,而且是全球唯一的,所以一个IP地址能够标识世界上一个唯一的一个主机。举个例子,你点开了抖音客户端,就相当于在手机上启动了一个进程,那么字节跳动公司的服务器将会把抖音的内容,通过网络传输给你的手机,但是不会仅仅传到手机上就好了,而是会将信息传给手机上的抖音客户端,也就是你启动的一个进程!所以说,通过全网唯一IP地址能够找到唯一的主机,然后通过端口号能够标识网络上的某一台主机的某一个进程,那么我们通过(IP地址,端口号)的组合,就能够找到全网唯一的进程了!

2024-04-10 10:00:00 1603 52

原创 网络基础知识入门

通过信号的 “频率” 和 “强弱” 来表示 0 和 1 这样的信息,而不同的计算机厂商,有的可能用高频率表示0,低频率表示1,有的厂商则相反,这样的话计算机之间就很难通信了,所以不同的计算机之间要想传递各种不同的信息,计算机厂商就需要约定好双方的数据格式,这就是一种在物理层上的协议。TCP/IP是因特网的正式网络协议(后面会讲),是一组在许多独立主机系统之间提供互联功能的协议,规范因特网上所有计算机互联时的传输、解释、执行、互操作,解决计算机系统的互联、互通、操作性,是被公认的网络通信协议的国际工业标准。

2024-04-07 17:59:00 2440 42

原创 Linux之 线程池 | 单例模式的线程安全问题 | 其他锁

如果临界区的代码执行时间较短的话,我们一般就最好使用自旋锁,而不是互斥锁,因为互斥锁申请失败,是要阻塞等待,是需要发生上下文切换的,如果临界区执行的时间比较短,那可能上下文切换的时间会比临界区代码执行的时间还要长。3、自旋锁:说到自旋锁,我们不得不说一说我们之前所用到的锁,我们之前所用的锁都是互斥锁,当线程没有竞争到互斥锁时,它会阻塞等待,只有等锁被释放了后,才能去重新申请锁。于是,我们可以通过线程池预先创建出一批线程,线程池维护着这些线程,线程等待着监督管理者分配可并发执行的任务。如果相等则用新值更新。

2024-04-01 13:19:01 2233 67

原创 Linux之信号量 | 消费者生产者模型的循环队列

我们在对环形队列进行访问时,当队列为空或者为满,生产者和消费者就会指向同一个位置,这时我们就需要生产者和消费者互斥和同步了,如果为空,让生产者先访问,为满就让消费者先访问。实际上并不是真正的环形队列,因为我们没有这种数据结构,它的实现是通过数组模拟的,当数据加入到最后的位置时直接模等于数组的大小即可,这样就可以回到数组的起始位置。但是,我们最理想的方案,其实是:如果在同一时刻,不同的执行流要访问的是临界资源的不同区域,那么我们是允许它们同时进行临界资源的访问,这样就大大提高了效率。这样就可以提高效率了。

2024-03-28 10:00:00 1701 57

原创 Linux生产者消费者模型之阻塞队列

生产者消费者模型是高效的。其高效体现在一个线程拿出来任务可能正在做处理,它在做处理的同时,其他线程可以继续从队列中拿任务,继续处理,所以其高效是我们可以让多个线程并发的同时处理多个任务!生产者线程也可以不断地并发地派发任务。

2024-03-25 09:21:08 1661 47

原创 Linux之线程同步

此时我们会发现唤醒这三个线程时具有明显的顺序性,因为这些线程启动时默认都会在该条件变量下去等待,而我们每次都唤醒的是在当前条件变量下等待的头部线程,当该线程执行完代码后会继续排到等待队列的尾部进行等待。这是因为如果个别线程的竞争力特别强,每次都能够申请到锁,但申请到锁之后什么也不做,所以在我们看来这个线程就一直在申请锁和释放锁,那么它就可以一直抢票。为了解决这个问题,我们增加一个限制:当一个线程释放锁后,这个线程不能立马再次申请锁,该线程必须排到这个锁的资源等待队列的最后。3、唤醒线程去访问临界资源。

2024-03-19 10:00:00 2085 67

原创 Linux之线程互斥

接着,判断%al的内容 >0,返回,成功拿到锁。可是,访问临界资源时,多个线程要申请同一把锁,那么就必须要能够看到同一把锁,那么这个锁不就成了一个临界资源了吗,那锁是怎么保证自己的安全的呢?发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请锁,但没有竞争到互斥量,那么pthread_ lock调用会陷入阻塞(执行流被挂起),等待互斥量解锁,再去申请锁。大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。

2024-03-15 10:00:00 2507 61

原创 Linux之线程控制

注:在Linux中,线程与内核的LWP是一一对应的,实际上操作系统调度的时候是根据LWP调度的,而不是PID,只不过我们之前接触到的都是单线程进程,其PID和LWP是相等的,所以对于单线程进程来说,调度时采用PID和LWP是一样的。如果主线程不对新线程进行等待,那么这个新线程的资源也是不会被回收的。一个线程如果被分离了,这个线程依旧要使用该进程的资源,依旧在该进程内运行,甚至这个线程崩溃了一定会影响其他线程,只不过这个线程退出时不再需要主线程去join了,当这个线程退出时系统会自动回收该线程所对应的资源。

2024-03-11 10:00:00 1698 49

C++的运算符重载代码

C++的运算符重载代码

2023-08-02

空空如也

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

TA关注的人

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