01 2019 档案
摘要:互斥量常用来做线程间同步,不过,我们可以恰当设置其属性实现进程间同步 互斥量类型为pthread_mutexattr_t,使用pthread_mutexattr_init函数来初始化,使用pthread_mutexattr_setpshared来设置pshared属性,进程锁属性设置为PTHREAD
阅读全文
摘要:linux下进程退出有8中方式 这里区分一下exit和_exit exit 我们知道父进程要wait子进程的退出状态,在子进程退出到父进程调用wait()期间,子进程就处于僵尸状态。因此,exit()将进程正常退出,并将(status & 0377)返回到父进程的wait(),其中status可以是
阅读全文
摘要:霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化。 概念 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 树的路径长度 从
阅读全文
摘要:进程在其声明周期内,由于系统中各个进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断发生变化,即一个进程会经历不同的状态 五种状态 1. 运行状态 进程在处理器上运行。在单处理器环境下,同一时刻只有一个进程在运行 2. 就绪状态 进程处于准备运行的状态。进程获得了除处理器之外的所有
阅读全文
摘要:在linux下,创建进程可以使用两个glibc函数,分别是 fork, vfork fork fork函数用来创建一个子进程,声明如下: #include <sys/types.h> #include <unistd.h> pid_t fork(void); fork函数,一次调用,两次返回。在父进
阅读全文
摘要:c++类成员的访问权限有三种,分别是 public, protected, private(默认)。其中private表示只允许在类内访问,使用这个特点,我们可以实现一些特殊作用的函数 私有构造函数 不能直接创建对象,单例模式往往使用这个方式 私有析构函数 析构函数被私有之后,就不能被自动析构,这样
阅读全文
摘要:使用场景 需要全进程唯一实例时,往往会使用单例模式进行设计 唯一数据入口 假设一个对象负责更改本地设置,例如配置服务的网络端口号。如果出现两个或多个线程,每个线程拥有一个实例,线程并发共同进行配置。每个实例都在修改端口号。最终修改的结果就是不可控的。 共用的资源 现在我们假设有一个数据队列,由三个数
阅读全文
摘要:设计模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns) 创建型模式 对象实例化的模式,这些模式可以在创建对象的同时隐藏创建逻辑的方式,可以解耦对象的实例化过程,包括: 工
阅读全文
摘要:用法 grep在文件中查找匹配正则表达式的内容,默认打印出匹配的一行 选项 使用文件grp.txt为演示 -e PATTERN, 使用-e选项可以匹配多个条件 -f FILE, 从文件中获取PATTERN-i 忽略大小写-v 反向匹配,只选择未匹配的 -w 匹配整个单词-x 匹配整行 可以看到 -x
阅读全文
摘要:观察者模式是对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 作用 将一个系统设计成一系列相互协作的类有一个常见的副作用:需要维护相关对象之间的一致性。 观察者模式定义一种交互: 使用场景 UML 参与者 CSubject: 目标,知道它的观察者,
阅读全文
摘要:dependency (use a) 依赖关系 当类Y与类X彼此独立,而类Y是类X成员函数的一个参数,或者X中成员函数的一个局部变量 assocation(konws a)关联关系 一个类是另一个类的成员变量 Aggregation (has a) 聚合关系 一个类是另一个类的集合或者容器,但被包含
阅读全文
摘要:定义 一个软件实体应当尽可能少地与其他实体发生相互作用 解释 迪米特法则包括不要和“陌生人”说话、只与你的直接朋友通信。对于一个对象,它的直接朋友包括: 任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要与“陌生
阅读全文
摘要:定义 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。 解释 不要提供大而全的接口给很多客户端使用,导致客户端不得不实现一些自己根本不需要的方法 一个类对另一个类的依赖应该建立在最小的接口上; 一个接口代表一个角色,不应该将不同的角色都交给一个接口,因为这样可能会形成
阅读全文
摘要:定义 抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。 解释 如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。 依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层
阅读全文
摘要:定义 所有引用基类(父类)的地方必须能透明地使用其子类的对象 解释 在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,因此我们需要注意的是,尽量不要重载或者重写父类的方法(抽象方法除外),因为这样可能会改变父类原有的行为。 里氏代换原则是实现开闭原则的重要方式之一,由于使用基类
阅读全文
摘要:定义 一个软件实体(如类、模块、函数)应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展 解释 在项目开发的过程中,需求会随时间的推移而发生变化。当软件系统需要面对新的需求时,我们应该尽量保证系统的设计框架是稳定的。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行
阅读全文
摘要:定义 就一个类而言,应该只有一个引起它变化的原因 解释 这是六大原则中最简单的一种。一个类只负责一种职责的工作。在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作 优
阅读全文
摘要:用法 只要初始化器的类型被确定,则编译器会用来自函数调用的模板实参推导规则所决定的类型替换关键词 在使用尾随返回类型语法的函数声明中,关键词 auto 不进行自动类型检测。它只作为语法的一部分起作用。 auto 的自动类型推导发生在编译期间,不会降低程序的运行效率。 替代冗长的变量声明 比如,以前对
阅读全文
摘要:bind 定义在头文件 functional 里 函数模板 bind 生成 f 的转发调用包装器。调用此包装器等价于以一些绑定到 args 的参数调用 f 。类似于 python 的 functools.partial 参数 f 表示可调用对象(函数对象、指向函数指针、函数的引用、指向成员函数指针或
阅读全文
摘要:ignore 一个未指定的类型对象,任何值都可以没有影响地赋值给它。通常使用tie来解压一个元组,作为可以忽略的占位符。 tie 创建一个元组的左值引用 可以看到,tie函数返回的是一个tuple的左值引用 tie函数可以用来解压一个pair,tuple,也可以用来产生一个结构体的字典序比较 输出:
阅读全文
摘要:定义 c++11添加了数组 array, 使用它需要包含 <array> 头文件,定义为: 优点 array不会像c语言中的数组一样会退化成T*。 输出: array 具有C风格的数组的优点,比如能够随机访问、知道大小、赋值,同时,支持C++容器的部分功能 缺点 默认情况下,array中的元素值是随
阅读全文
摘要:1. 排序法 时间复杂度 O(nlogn) 2. 使用一个大小为K的数组arr保存前K个最大的元素 遍历原数组,遇到大于arr最小值的元素时候,使用插入排序方法,插入这个元素 时间复杂度,遍历是 O(n), 插入 O(K), 所以时间复杂度 O(nK) 3. 二叉堆--小顶堆 维护一个有K个元素的小
阅读全文