自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode 2097 — 合法重新排列数对

欧拉图

2022-06-29 12:34:25 222 1

原创 leetcode 6103 — 从树中删除边的最小分数

leetcode 6103 — 从树中删除边的最小分数

2022-06-26 13:39:46 366

原创 leetcode 2157 — 字符串分组

leetcode 2157 — 字符串分组一、题目描述二、思路分析三、实现1、并查集(1)等价类一、题目描述二、思路分析这里需要注意题目里给出的要求:在任意一个子串中,每个字母最多只出现一次。这就提示我们使用26位二进制数来表示每一个字符串以及与它相关联的字符串。那么怎么得到一个数所有相关联的字符串呢?这里主要就是借助位运算:添加或者删除一个字符串可以认为是对某一位取反;替换一个字符串相当于任取一个0和一个1的位,取反。三、实现我们可以选择将所有字符串构成图,借助广度优先搜索找到所有关联集

2022-05-25 09:20:33 313

原创 leetcode 2227 — 加密解密字符串

leetcode 2223 — 构造字符串的总得分和一、题目描述二、算法1、字典树2、实现一、题目描述二、算法这道题使用逆向分析比较简单,我们这里主要是学习下字典树的使用。1、字典树字典树(trie),其实就是一个有限状态自动机。一个由 a、an、the 三个单词构成的字典树如图:通常,我们可以使用状态转移矩阵来保存转换过程:class Trie { static const int MAX_STATUS_NUM = 100000; int statusNum = 0; int fs

2022-05-19 23:28:53 402

原创 《深入理解计算机系统》—— 存储器、链接和内存管理

@Toc一、存储器层次结构1、存储器层次结构中的缓存(1)缓存不命中(2)缓存不命中的种类2、高速缓存存储器(1)通用的高速缓存存储器组织结构(2)直接映射高速缓存a. 组选择b. 行匹配c. 字选择d. 不命中时的行替换e. 冲突不命中(3)组相连高速缓存a. 组选择同直接相连高速缓存b. 行匹配和字选择c. 不命中时的行替换(4)全相连告诉缓存a. 组选择b. 行匹配和字选择(5)有关写的问题二、链接1、静态链接2、目

2022-05-17 09:18:12 288

原创 《操作系统概念》—— 内存管理

《操作系统概念》—— 内存管理一、内存管理策略1、基本硬件2、地址绑定3、逻辑地址空间与物理地址空间4、动态加载5、动态链接与共享库6、交换7、连续内存分配(1)内存分配(2)碎片8、分段(1)基本方法(2)分段硬件9、分页(1)基本方法(2)硬件支持(3)保护(4)共享页10、页表结构(1)分层分页(2)哈希页表(3)倒置页表二、虚拟内存管理1、背景2、请求调页3、写时复制4、页面置换(1)基本页面置换(2)FIFO页面置换(3)最优页面置换(4)LRU页面置换(5)近似LRU页面置换a. 额外引用位算法

2022-05-15 22:48:26 264

原创 《操作系统概念》—— 同步与死锁

《操作系统概念》—— 同步与死锁一、同步1、竞争条件2、临界区问题(1)定义和解决条件(2)内核竞争3、Peterson解决方案4、硬件同步5、互斥锁6、信号量(1)定义(2)使用(3)实现(4)死锁与饥饿(5)优先级的反转7、经典同步问题(1)有界缓冲问题(2)读者-作者问题(3)哲学家就餐问题8、管程(1)出现原因(2)使用方法(3)哲学家就餐问题的管程解决方案(4)采用信号量的管程实现(5)管程内的进程重启二、死锁1、必要条件2、资源分配图3、死锁处理方法4、死锁预防(1)互斥(2)持有且等待(3)无

2022-05-15 22:46:52 229

原创 《操作系统概念》—— 进程与线程

@Toc一、进程1、进程状态2、进程控制块(PCB)3、进程调度等待运行的进程保存在就绪队列上;等待特定I/O设备的进程列表,称为设备队列。对于批处理系统,提交的进程多于可以立即执行的。这些进程会被保存到大容量存储设备的缓冲池,以便以后执行。长期调度程序从该池中选择进城。短期调度程序从准备执行的进程中选择进程。I/O密集型进程,执行I/O比执行计算需要花费更多时间。相反,CPU密集型进程很少产生I/O请求,而是将更多时间用于执行计算。4、进程间通信(1)共享内存系统(2)消息传

2022-05-15 22:42:46 377

原创 leetcode 2223 — 构造字符串的总得分和

leetcode 2223 — 构造字符串的总得分和一、题目描述二、算法一、题目描述二、算法这道题实际上就是考察的扩展 KMP 算法。与 KMP 算法类似,扩展 KMP

2022-04-20 11:41:54 1215

原创 leetcode 2213 — 由单个字符重复的最长子字符串

leetcode 2213 — 由单个字符重复的最长子字符串

2022-04-18 20:43:24 501

原创 leetcode 2187 — 完成旅途的最少时间

leetcode 2187 — 完成旅途的最少时间一、题目描述二、题目分析三、实现1、初步实现2、步长改进实现3、二分法实现一、题目描述二、题目分析我的第一个想法是为每辆车保存 (totalTime, remainTime) 元组,二者分别用于记录完成一次旅途的总时间以及完成当次旅途的剩余时间。使用这两个时间排序所有公交车,序列的首元素即为当次旅途需要选用的车辆。在每次选用一辆车之后更新所有车辆的剩余时间(减去选用车辆的剩余时间)。该算法时间复杂度为 O(time.length∗totalTrips

2022-03-23 15:30:19 1996

原创 leetcode 2179 — 统计数组中好三元组数目

统计数组中好三元组数目一、题目描述二、题目分析三、算法四、实现1、初步实现一、题目描述二、题目分析这道题的暴力解法就是:枚举 nums1 中的每个元素,找到该元素在 nums2 中的位置,然后在 nums1 和 nums2 的剩余部分中寻找一个好二元组。不难发现,这样算法的复杂度为 O(n^3),不能满足我们的要求。上述算法的问题在于每次搜索都无法利用前面搜索过程得到的任何信息。关键点1:nums2 中的元素如果被访问过,在后续访问时是不用处理的,因为这样的元素对在 nums1 和 nums2

2022-03-22 20:58:47 1780 1

原创 leetcode 2172 — 数组的最大与和

leetcode 2172 — 数组的最大与和一、题目描述二、题目分析三、算法四、实现一、题目描述二、题目分析题目中给出的篮子数目并不多。然而,如果我们分析在 numSlots = 9,nums.size() = 18 这种情况下可能出现的分配方式个数:第一个篮子有 C182C_{18}^2C182​ 中选择,依此类推,共计 12,504,636,144,000 种情况。因此,我们需要压缩所有情况的个数。关键点1:每个篮子只能放置2个数字因此,每个篮子中放置数字的个数只可能是 0,1,2

2022-03-21 14:33:21 609

原创 《敏捷软件开发》— 设计模式(一)

《敏捷软件开发》— 设计模式(一)一、Command 模式和 Active Object 模式1、Command 模式2、Active Object 模式一、Command 模式和 Active Object 模式1、Command 模式我们在 《设计模式》— 行为型模式 — 命令模式中学习过命令模式。该模式可以将负责实现业务逻辑的模块与上层模块分离。2、Active Object 模式Active Object 模式是命令模式在多线程控制的具体应用。...

2022-02-27 22:17:57 375

原创 《敏捷软件开发》— 设计原则(三)

《敏捷软件开发》— 设计原则(二)一、依赖倒置原则1、层次化(1)接口所有权的倒置(2)依赖于抽象二、接口隔离原则(ISP)1、接口污染2、分离客户与分离接口3、满足 ISP一、依赖倒置原则高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。这里有个很有趣的问题:为什么是倒置呢?在经典的层次结构中,我们会把系统设置为三层模式:表示层,服务层,持久化层。其中,表示层依赖于服务层,服务层依赖于持久化层。一个设计良好的面向对象程序,其依赖程序结构相对于传统的过

2022-02-24 22:02:37 376

原创 《敏捷软件开发》— 设计原则(二)

《敏捷软件开发》— 设计原则(二)一、Liskov 替换原则(LSP)1、关键仍是抽象2、几维鸟(1)几维鸟是一种鸟(2)几维鸟不是鸟3、正方形和矩形一、Liskov 替换原则(LSP)子类型必须能够替换掉它们的基类型。如果我们不遵守这项原则,则导致在使用派生类对象作为参数调用以基类对象为参数的方法时,程序的运行错误行为。这种错误有可能是抛出了异常,也有可能是错误的运行状态。1、关键仍是抽象想要满足里氏替换原则,关键仍在抽象上。在某个程序或者某个领域中满足此原则的设计,在经过迁移后可能会变得不

2022-02-23 21:37:38 271

原创 《敏捷软件开发》— 设计原则(一)

《敏捷软件开发》— 设计原则一、单一职责原则(SRP)1、职责2、分离耦合的职责二、开放-封闭原则(OCP)1、抽象2、Shape 程序一、单一职责原则(SRP)就一个类而言,应该仅有一个引起它变化的原因。这项设计原则体现了模块的内聚性要求。当需求变化时,该变化会反映为类的功能的变化。如果一个类承担了多于一个的职责,那么就可能有多个原因导致其发生变化。一个职责的变化可能会抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,无法很好的响应变化。1、职责在 SRP 中,我们把职责定义为变化的原

2022-02-10 21:46:34 612

原创 《敏捷软件开发》— 敏捷设计

《敏捷软件开发》— 敏捷设计一、设计的臭味1、僵化性2、脆弱性3、牢固性4、粘滞性5、不必要的复杂性6、不必要的重复7、晦涩性二、copy 程序1、初始需求2、增加输入设备类型3、增加输出设备类型4、copy程序的敏捷设计一、设计的臭味1、僵化性僵化性是指难以对软件进行改动,即使是简单的改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。必须要改动的模块越多,设计就越僵化。很多开发人员在工作中都遇到过这样的情况。看着很简单的一个问题,只改了一行代码,却影响了整个程序。这就是所

2022-02-08 20:01:37 603

原创 《敏捷软件开发》— 敏捷开发 — 极限编程概述

《敏捷软件开发》— 敏捷开发 — 极限编程概述一、极限编程是敏捷方法中最著名的一个。它由一系列简单却相互依赖的时间组成。一、

2022-01-28 19:45:24 660

原创 C++标准 — C++17特性 — 文件系统 — path 路径处理

C++标准 — C++17特性一、path1、分解2、查询3、拼接(1)append、/=(2)concat、+=4、修改5、遍历6、比较一、path类型 path 的对象表示文件系统上的路径。只有路径的语法外观得到处理:路径名可能表示不存在的路径,或甚至不允许存在于当前文件系统或操作系统的路径。路径名拥有下列语法:root-name(可选):标识具有多个根目录的文件系统(如 “C:” 或 “//myserver”)。有歧义的情况下,将组成合法根名的最长序列当做根名 。标准库可以在 OS API

2022-01-25 11:05:18 7716 2

原创 《敏捷软件开发》— 敏捷开发 — 敏捷实践

《敏捷软件开发》— 敏捷开发一、敏捷实践1、敏捷联盟(1)个体和交互胜过过程和工具(2)可以工作的软件胜过面面俱到的文档一、敏捷实践在敏捷开发之前,我们常用的开发模式是瀑布模式。然而,这种模式有很多问题,包括不能很好的响应变化,容易开发出庞杂而难以理解的系统,导致维护和二次开发变得很困难等。此外,这种模式还会降低团队的开发效率,使得团队经常创建错误的产品。其原因在于这样的过程缺乏实践指导和外部过程管控。即使在现在,国内还有很多公司采取的是瀑布式开发模式。1、敏捷联盟01年初,由于看到许多公司的软件团

2022-01-24 09:39:55 1692

原创 《设计模式》— 行为型模式 — 解释器模式

《设计模式》— 行为型模式 — 解释器模式一、动机二、适用性三、结构四、参与者1、AbstractExpression2、TerminalExpression(终结符表达式)3、NonterminalExpression(非终结符表达式)4、Context5、Client五、效果1、易于改变和扩展问法2、易于实现文法3、负责的文法难以维护4、增加了新的解释表达式的方式六、实现1、创建抽象语法树2、定义解释操作3、与 Flyweight 模式共享终结符一、动机如果一种特定类型的问题发生的频率足够高,那么可

2022-01-21 21:15:11 505

原创 《设计模式》— 行为型模式 — 备忘录模式

《设计模式》— 行为型模式 — 备忘录模式一、动机二、适用性三、结构四、效果1、保持封装边界2、简化了原发器3、使用备忘录可能代价很高4、定义窄接口和宽接口5、维护备忘录的签字按代价五、实现1、语言支持2、存储增量式改变一、动机有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制。而要实现这些机制,你必须实现将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其部分或所有的状态信息,使得其状态不能被其他对象访问,也就不可能在该

2022-01-20 19:57:55 283

原创 《设计模式》— 行为型模式 — 访问者模式

《设计模式》— 行为型模式 — 访问者模式一、动机二、适用性三、结构四、参与者1、Visitor2、ConcreteVisitor3、Element4、ConcreteElement5、ObjectStructure五、协作六、效果一、动机考虑一个编译器,它将源程序表示为一个抽象语法树。该编译器需要在抽象语法书上实施某些操作以进行”静态语义“分析,例如检查所有的变量是否都已经被定义了。它也需要生成代码。因此它可能要定义许多操作以进行类型检查、代码优化、流程分析,检查变量是否在使用前被赋值等。此外,还可以

2022-01-18 20:16:13 120

原创 C++标准 — C++11特性补充

C++标准 — C++11特性补充一、属性标识符二、编码转化三、typeindex四、hash五、system_error一、属性标识符C++11中,引入了属性标识符的概念,用于修饰类型,对象,代码等。其表示方法为:[[ attribute-list ]]属性列表由 , 分割的属性组合而成。属性有四种表示方法:简单属性,如 [[noreturn]]。名称空间中的属性,如 [[gnu::unused]]。带参的属性,如 [[deprecated(“because”)]]。名称空间中的带参属

2022-01-17 18:24:56 837

原创 《设计模式》— 结构型模式 — 享元模式

《设计模式》— 结构型模式 — 享元模式一、意图一、意图有些应用程序得益于在其整个设计过程中采用对象技术,但简单化的实现代价极大。例如,大多数文档编辑器的实现都有文本格式化和编辑功能,这些功能在一定程度上是模块化的。面向对象的文档编辑器通常使用对象来表示嵌入的成分,例如表格和图形。尽管用对象来表示文档中的每个字符会极大地提高应用程序的灵活性,但是这些编辑器通常并不这样做。字符和嵌入成分可以在绘制和格式化时统一处理,从而在不影响其他功能的情况下对应用程序进行扩展,支持新的字符集。应用程序的对象结构可以模

2022-01-16 21:14:24 134

原创 C++标准 — C++14特性

C++标准 — C++14特性一、变量模板二、lambda 表达式的新增功能1、泛化2、对捕获的变量和引用进行初始化一、变量模板在C++11及之前,我们只有针对类和函数的模板。C++14中,新增了变量模板:template<class T>constexpr T pi = T(3.1415926535897932385L);template<class T>T circular_area(T r){ return pi<T> *r * r;}变量模

2022-01-16 12:58:31 3918

原创 《设计模式》— 行为型模式 — 中介者模式

《设计模式》— 行为型模式 — 中介者模式一、动机一、动机面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏情况下,每一个对象都知道其他所有对象。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作——系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为分布在许多对象中。这造成我们不得不定义很多子类以定制系统的行为。...

2022-01-14 22:06:44 65

原创 《设计模式》— 结构型模式 — 外观模式

《设计模式》— 结构型模式 — 外观模式一、动机二、适用性三、结构一、动机将一个系统划分成若干个子系统有利于降低系统地复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一就是引入一个外观对象,它为子系统中较为一般的设施提供了一个单一而简单的界面。这个模式在如 Windows 操作系统中应用的十分广泛。在使用命令行作为交互工具的操作系统中,其提供的各项功能固然强大,但是这种交互方式却不适合普通用户使用。在 Windows 操作系统中,提供了一个用户界面并且对用户屏蔽了

2022-01-12 20:54:02 132

原创 《设计模式》— 行为型模式 — 策略模式

《设计模式》— 行为型模式 — 策略模式一、动机二、适用性三、结构四、参与者1、Strategy2、ConcreteStrategy3、Context五、协作六、效果1、一个替代继承的方法2、客户必须了解不同的策略3、增加了对象的数目七、实现1、定义 Strategy 和 Context 接口2、将 Strategy 作为模板参数八、应用一、动机有许多算法可以对一个文本流进行分行。将这些算法硬编进使用它们的类中是不可取的。其原因如下:需要换行功能的客户程序如果直接包含换行算法代码的话将会变得复杂,这

2021-12-22 21:52:33 87

原创 《设计模式》— 行为型模式 — 迭代器模式

《设计模式》— 行为型模式 — 迭代器模式一、动机二、适用性三、结构四、效果1、支持以不同的方式遍历一个聚合2、简化了聚合的接口3、在同一个聚合上可以有多个遍历五、实现1、谁该控制迭代2、谁定义遍历算法3、迭代器健壮性如何4、用于组合对象的迭代器六、应用一、动机一个聚合对象,如列表(list),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。此外,针对不同的需求,可能要以不同的方式遍历这个列表。但是即使可以预见到所需的那些便利操作,你也可能不希望列表的接口中充斥着各种不同遍历的操作

2021-12-21 21:36:42 341

原创 《设计模式》— 行为型模式 — 观察者模式

《设计模式》— 行为型模式 — 观察者模式一、动机二、适用性三、结构四、参与者1、Subject2、Observer3、ConcreteSubject4、ConcreteObserver五、协作六、效果1、目标和观察者间的抽象耦合2、支持广播通信3、意外的更新七、实现1、创建目标到其观察者之间的映射2、观察多个目标3、谁触发更新4、在发出通知前确保目标的状态自身是一致的5、避免特定于观察者的更新协议 —— 推/拉模型6、显式地指定感兴趣的改变7、封装复杂的更新语义八、应用一、动机将一个系统分割成一系列相

2021-12-20 21:51:01 321

原创 《设计模式》— 行为型模式 — 命令模式

《设计模式》— 行为型模式 — 命令模式一、动机二、适用性三、结构四、参与者1、Command2、ConcreteCommand3、Client4、Invoker5、Receiver五、协作六、效果七、实现1、一个命令对象应达到何种智能程度2、支持撤销和重做3、使用C++模板类八、应用一、动机有时必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息。例如,用户界面包括按钮和菜单这样的对象,它们执行请求响应用户输入。但工具箱不能显式地在按钮或菜单中实现该请求,因为只有使用工具箱的应用知

2021-12-19 21:45:15 177

原创 《设计模式》— 行为型模式 — 模板方法模式

《设计模式》— 行为型模式 — 模板方法模式一、动机一、动机考虑一个提供 Application 和 Document 类的应用框架。Application 类负责打开一个已有的以外部形式存储的文档,如一个文件。一旦一个文档中的信息从该文件中读出后,它就由一个 Document 对象表示。用框架构建的应用可以通过继承 Application 和 Document 来满足特定的需求。例如,一个绘图应用定义 DrawApplication 和 DrawDocument 子类等,如下所示。这里的 cre

2021-12-18 21:17:51 154

原创 《设计模式》— 行为型模式 — 状态模式

《设计模式》— 行为型模式 — 状态模式一、动机二、适用性三、结构四、参与者1、Context2、State3、Concrete State五、协作六、效果1、将与特定状态相关的行为局部化,并且将不同状态的行为分割开来2、使得状态转换显式化3、State 对象可被共享七、实现1、谁定义转换2、基于表的另一种方法3、创建和销毁对象八、应用1、State(1)抽象类(2)初始状态(3)读取字符状态(4)读取转义字符状态(5)结束读取类2、Context3、测试4、对比一、动机考虑一个表示网络连接的类 TCP

2021-12-18 14:48:37 483

原创 《设计模式》— 行为型模式 — 责任链模式

《设计模式》— 行为型模式 — 责任链模式一、动机二、适用性三、结构四、参与者1、Handler2、ConcreteHandler3、Client五、效果1、降低耦合度2、增加了给对象指派职责的灵活性3、不保证被接受六、实现1、实现后继者链2、连接后继者3、表示请求七、应用一、动机考虑一个图形用户界面的上下文有关的帮助机制。用户在界面的任一部分点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分及其上下文。例如,对话框中按钮的帮助信息就可能和主窗口中类似的按钮不同。如果对那一部分界面没有特定

2021-12-16 20:33:25 471

原创 《设计模式》— 结构型模式 — 代理模式

《设计模式》— 结构型模式 — 代理模式一、动机二、适用性三、结构四、参与者1、Proxy2、Subject3、RealSubject五、实现1、C++中的存取运算符2、代理并不总是需要知道实体的类型六、实现1、抽象类及被代理类2、代理工厂3、handler4、测试七、相似设计模式一、动机对一个对象进行访问控制的一个原因是只有我们确实需要这个对象时才对它进行创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性

2021-12-15 22:10:27 163

原创 《设计模式》— 结构型模式 — 装饰模式(包装器)

《设计模式》— 结构型模式 — 装饰模式(包装器)一、动机二、适用性三、结构四、参与者1、Component2、ConcreteComponent3、Decorator4、ConcreteDecorator五、协作六、效果1、比静态继承更灵活2、避免在层次结构高层的类有太多的特征3、Decorator 与它的 Component 不一样4、有许多小对象七、实现1、接口的一致性2、省略抽象的 Decorator 类3、保持 Component 的简单性4、改变对象外壳与改变对象内核八、应用举例一、动机有时

2021-12-14 21:43:08 869

原创 《设计模式》— 结构型模式 — 组合模式

《设计模式》— 结构型模式 — 组合模式一、问题来源二、适用性三、结构四、参与者1、Component(Graphic)一、问题来源在绘图编辑器和图形捕捉系统这样的图形应用程序中,我们可以通过组合已有的组件形成新的组件加入到工具箱中。一个简单的实现方式是为所有基本元素定义一些类,另外定义一些类作为这些图元的容器类。这种方法存在一个问题:使用这些类的代码必须区别对待图元对象与容器对象,而实际上对于用户来说,它们是一致的。对这些类区别使用,将造成设计和实现上的困难。我们可以通过组合模式递归组合,使得用户不

2021-12-13 22:17:54 826

原创 《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发 — 条件变量与原子操作

《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发 — mutex 与 lock一、条件变量1、意图2、条件变量的基本使用3、使用条件变量实现消费队列4、细究条件变量二、Atmoic1、使用 Atmoic2、与其他变量共同使用一、条件变量1、意图我们前面介绍的 future 主要用于传递线程的返回值和异常。但是,有时我们需要确保不同线程之间的工作流。我们可以使用一个简单的变量和锁来控制,其带来的结果就是我们需要在线程中轮询该变量的值:bool ready = false;mutex

2021-12-11 15:04:12 551

空空如也

空空如也

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

TA关注的人

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