摘要: 需掌握的硬技术: 0. 常用的数据结构、算法; 1. 面向对象思想、面向对象设计原则、面向对象开发和实现;另外对于思想还有面向过程、面向接口服务、面向切面、函数式编程等; 2. 设计模式、架构模式、I/O模式、分布式模式、网络模式等; 3. 服务端的开发经验,各类服务端相关技术; 4. 后端开发语言 阅读全文
posted @ 2019-10-27 11:08 浩月星空 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 一、几个常用小工具: 1. 编译器:CL.EXE 将源文件转变为目标文件(汇编语言)。 CL.EXE /c xxx.c 或 xx.cpp cl.exe -? 显示cl帮助 cl.exe /c 只编译不链接 cl.exe /Tc 编译c文件 cl.exe /l 头文件路径 链接器:LINK.EXE 将 阅读全文
posted @ 2017-04-22 11:07 浩月星空 阅读(501) 评论(0) 推荐(0) 编辑
摘要: 0. Python安装 官网提供多种方式,一般Windows下直接安装exe即可;Linux下基本上自带python;另外也提供源码,也可自行编译; 若安装后无法使用,则检查一下环境变量是否设置正确。 额外:除了最主要的官网资料、文档外,Python的wiki也提供了很多有用的信息 1. Pytho 阅读全文
posted @ 2017-03-19 16:19 浩月星空 阅读(363) 评论(0) 推荐(0) 编辑
摘要: 1. 计算存储和处理的信息以01二进制信号表示。 2. 计算针对较小范围的整数是精确表示的,而对浮点数则是近似表示的。 3. 整数计算溢出,不因交换律、结合律而改变该溢出后的值,浮点运算溢出则正负号始终保持。 4. 计算机信息的存储:8位的块(即字节)作为最小可寻址的内存单位。二进制、十六进制、十进 阅读全文
posted @ 2017-01-02 11:46 浩月星空 阅读(389) 评论(0) 推荐(0) 编辑
摘要: 这一章节主要从整体上粗略地介绍了该书中涉及到的知识如以下几点: 1、信息的存储:比特串位; 2、C程序编译过程: 1) 源码(.c)经过预处理器得到修改后的文件(.i)(主要是扩展include或者宏替换等); 2) .i文件再经过编译器编译为汇编文件(.s); 3) .s汇编文件通过汇编器编译为目 阅读全文
posted @ 2017-01-01 17:57 浩月星空 阅读(425) 评论(0) 推荐(0) 编辑
摘要: locale.h 区域设置相关,主要针对时间日期、货币格式、字符控制、数字格式等以满足某区域的设置需要。 locale设置类别主要包括以下几个宏定义的类别: LC_ALL:设置所有的类别; LC_COLLATE:设置控制整理顺序; LC_CTYPE:设置字符分类; LC_MONETARY:设置货币的 阅读全文
posted @ 2016-12-04 14:00 浩月星空 阅读(2157) 评论(0) 推荐(0) 编辑
摘要: limits.h 类似于float.h,其定义了一些列类型的值的范围、限制值,也就是说该类型的值不可以大于该上界或者小于该类型值的下界; glibc中宏定义了一下的值: # define MB_LEN_MAX 16 // 多字节字符的最大字节(byte)数为16位 # define CHAR_BIT 阅读全文
posted @ 2016-12-03 16:05 浩月星空 阅读(1166) 评论(0) 推荐(0) 编辑
摘要: float.h 内部主要包含了一系列的浮点数宏、指明可移植程序必要的常量;浮点数格式一般为Spxbe;其中S表示+-;p表示底数、b表示基数如2、8、10、16等进制,e为指数标识E或e; 在一般情况下可以直接使用该头文件中宏定义的值。 glibc下没有专门针对float.h的文件,其一般以stdl 阅读全文
posted @ 2016-12-03 15:33 浩月星空 阅读(1910) 评论(0) 推荐(0) 编辑
摘要: errno.h 提供了一个整数全局变量errno,当系统调用或者库函数的错误事件发生时可能会修改该值,指明错误的原因,该值可在任何需要的地方被修改;一般情况不为0的值表示出现了异常或者错误。 errno.h中定义了一系列的错误代码,以E开头的宏。 glibc中extern int errno来声明定 阅读全文
posted @ 2016-12-03 13:31 浩月星空 阅读(1087) 评论(0) 推荐(0) 编辑
摘要: ctype.h 主要提供了一些函数用以测试字符或字符处理的功能函数;包括字符判断检测、字符转换; 目前ASCII字符可分为以下一些类型,如:大写、小写、字母、数字、十六进制、空白字符、可打印字符、控制字符、字母数字、标点符号等,部分类型可能会重叠; ctype.h提供了如下字符处理函数; int i 阅读全文
posted @ 2016-12-03 13:04 浩月星空 阅读(5715) 评论(0) 推荐(0) 编辑
摘要: 先简单介绍一下<assert.h>头文件,该头文件的目的便是提供一个宏assert的定义,即可以在程序必要的地方使用其进行断言处理;断言在程序中的作用是当在调试模式下时,若程序给出的前提条件没有满足或是没有达到预期预定的条件便会出现断言为假,此时程序会异常终止,调试时会挂在该断言失败处(即结果为fa 阅读全文
posted @ 2016-12-03 11:57 浩月星空 阅读(1233) 评论(0) 推荐(0) 编辑
摘要: 基本上很多编程语言都会提供针对语言本身的一系列的标准库或者包,当然C语言同样也有提供标准库,C语言的标准库是一系列的头文件的集合;如assert.h、ctype.h、errno.h、float.h、limits.h、locale.h、math.h、setjmp.h、signal.h、stdarg.h 阅读全文
posted @ 2016-12-03 10:58 浩月星空 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 很多时候第三方库或其他项目提供的库多数会以动态库的形式提供dll以及相应的lib导入库、头文件,不过也有的只是提供dll和头文件,或者也提供了def模块定义(用于导出函数)文件,此时若使用将不得不调用LoadLibrary以及GetProcAddress以获取一系列需要的函数,相对来说比较繁琐;多数 阅读全文
posted @ 2016-08-24 14:19 浩月星空 阅读(2540) 评论(0) 推荐(0) 编辑
摘要: 在《Duilib源码分析(一)整体框架》、《Duilib源码分析(二)控件构造器—CDialogBuilder》以及《Duilib源码分析(三)XML解析器—CMarkup》中我们已从粗略的角度去分析框架操作流程和消息流程,只能对其有基本的印象,此处我们将通过实际的举例分析,duilib创建的工... 阅读全文
posted @ 2015-12-17 21:45 浩月星空 阅读(2794) 评论(0) 推荐(0) 编辑
摘要: 适配器(adapters): 概念上类似于设计模式中的适配,此处STL中的适配器可对组件的组合、灵活运用扮演重要角色。 STL中适配器主要有:容器适配器、迭代器适配器、仿函数适配器 容器适配器: queue(先进先出)、stack(先进后出)、priority_queue(优先队列)适配器,即queue和stack的_Sequence序列模板参数默认类型为deque<T>(双端队列), prior 阅读全文
posted @ 2019-10-13 13:59 浩月星空 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 此外还有const属性剔除模板类,如: _Constant_void_fun、_Constant_unary_fun、_Constant_binary_fun以及基于此三者继承而来的仿函数模板类,如: constant_void_fun、constant_unary_fun、constant_bin 阅读全文
posted @ 2019-10-13 13:02 浩月星空 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 一、单一职责原则(SRP) 定义: 就一个类而言,应该仅有一个引起它变化的原因。 说明: 如何识别并分离职责: 一般类所谓的职责,指的是完成某项工作或认为所提供的功能,其可由一系列功能函数支持实现;分离职责即可按照分离功能实现的策略进行。 小结: 单一职责看似简单,实则比较复杂,其主要体现在识别职责 阅读全文
posted @ 2019-10-12 17:42 浩月星空 阅读(895) 评论(0) 推荐(0) 编辑
摘要: 一、模板 二、异常处理 1) 检验throw操作的函数; 2) 决定throw操作是否发生在try区段; 3) 若是,则把异常对象的类型与每个catch子句对比(依赖RTTI机制); 4) 若吻合时,则流程控制交给catch子句中(catch子句可以处理异常或其他的资源释放或恢复等操作,也可以继续抛 阅读全文
posted @ 2019-10-12 13:41 浩月星空 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 一、对象的构造与析构 二、new和delete操作符 三、临时性对象 1) 一般认为,临时性对象被摧毁应是在对完整的表达式在求值过程中的最后一个步骤时; 2) 若临时对象被绑定在一个引用上,则其生命周期被延长,直到该引用的生命周期结束或直到临时对象的生命作用域范围结束,此时视哪一种情况先到达而定。 阅读全文
posted @ 2019-10-12 11:47 浩月星空 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 一、类虚函数杂谈 0.虚基类中若存在成员变量,应提供可初始化的构造函数或默认参数的构造函数,避免该成员变量无法被初始化到;当然若不是出于公共部分剥离到父类,则可以将其下层到子类中去,避免基类增加不必要的构造函数。 1.建议不要把基类中的虚析构函数置为存虚的。 2.不必要把子类基本不会覆写的函数设置为虚函数,也不应该全部函数加上virtual修饰由编译器来帮助取消一些成员函数的虚函数... 阅读全文
posted @ 2019-10-11 23:53 浩月星空 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 一、类成员函数调用方式 二、虚成员函数 虚函数的调用,当由一个指向子类的基类指针对象或引用对象时,需要在运行期获取到足够的信息,以表明当前实际执行实体。在类对象模型中,只要有虚函数,则就需要执行期的额外信息(当前指针指向的真实类型以及实际的实体所在位置地址)。这就涉及到vptr和vtable表的构建 阅读全文
posted @ 2019-10-11 20:15 浩月星空 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 一、类数据成员绑定 1.一个空类的大小不会为空,一般为一个char,即1个字节大小,其为了区分不同两个空类对象,需要一个地址来表示。 2.一个类的sizeof的大小,由多个方面影响: 1)语言本身的负担(如虚指针) 2)不同编译器对特殊情况的优化处理(如继承于一个空类的类,编译器可能做优化) 3)alignment对齐方式的限制(因为对齐的原因,成员变量的顺序有时也会对sizeof大小影响)。 3 阅读全文
posted @ 2019-10-11 14:19 浩月星空 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 一、C++ 默认构造函数 1.关键字explict的引入为解决单个参数的构造函数被隐式当作一个转换运算符的窘迫,此关键字要求在单个参数的构造函数时需显式调用构造函数,而不是当作转换运算;故除非的确需要用到类包装器的转换类时,否则一般情况下单个参数的构造函数建议用explict修饰。 2.编译器会在必要的时候生成默认构造的构造函数,什么情况下是必要的时候,另外生成的默认构造函数是... 阅读全文
posted @ 2019-10-11 11:23 浩月星空 阅读(258) 评论(0) 推荐(0) 编辑
摘要: C++ 对象模型 相对C语言的结构体和函数分离实现的不同,C++的对象模型基于类或继承,实现针对自身的从内存空间和存取时间做了优化或称为折中。 (1). C++对象模型的基本布局,如下图: 1.非静态数据成员在每个类对象中均有一份独立的实体,如:_x; 2.静态数据成员放置在类外,仅有一份共享实体,如:_point_count; 3.静态或非静态的成员函数也被放置在类外... 阅读全文
posted @ 2019-10-11 00:02 浩月星空 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 待续...... 阅读全文
posted @ 2019-10-10 21:00 浩月星空 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 待续...... 阅读全文
posted @ 2019-10-10 20:59 浩月星空 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 待续...... 阅读全文
posted @ 2019-10-10 20:58 浩月星空 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 1. 确定使用正确的Python版本(Python2/Python3)以及实现版本运行时环境(解释器)(CPython/Jython/IronPython/Pypy),建议使用Python3 2. 应严格按照PEP8的代码规范编写代码,使用同一套风格以便于协同开发项目以及后期维护工作 3. 确定不同情况下,Python3使用bytes(8位字节编码)、str(Unicode编码)类型,可编写辅助函 阅读全文
posted @ 2019-10-10 20:57 浩月星空 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 0. IPython Python的命令行扩展工具 1. 列表推导 [] 2. 迭代器 需实现__next__、__iter__接口的迭代器类 3. 生成器 使用yield的函数,便成为了生成器对象,可使用next函数、send、close、throw等函数结合使用;此外可实现协程 4. 生成器表达式 类似于列表推导,但是其使用()而不是[],并成为生成器类 5. itertools模块 提供更高 阅读全文
posted @ 2019-10-10 20:53 浩月星空 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 如何开始一个python3.x项目,包括创建干净的python虚拟环境,安装需要的包,创建工程,Git托管等4个步骤 以下为具体操作步骤: 0. 检查是否安装相应版本的Python3,若未安装则先安装Python3(Linux下一般自带(版本一般不是最新的),Windows需单独安装) 1. 安装pip3,sudo apt-get install python3-pip, 此外安装后可通过pip3 阅读全文
posted @ 2019-10-10 20:51 浩月星空 阅读(564) 评论(0) 推荐(0) 编辑
摘要: Node异步编程难点: 1. 异常处理 不能仅仅依靠传统的try/catch/final语句块进行异常捕获;而是应采用回调函数调用时传err错误码参数的方式捕获异常; 原则1:必须执行调用者传入的回调函数,回调函数第一个参数是err,err为真,则有异常,则可执行异常后续处理,否则执行相应的正常操作。 原则2:正确传递回异常供调用者判断,即在编写异步方法时,只要将异常正确传递给用户的回调方法即可, 阅读全文
posted @ 2019-10-10 20:43 浩月星空 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 待续...... 阅读全文
posted @ 2019-10-10 20:37 浩月星空 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 待续...... 阅读全文
posted @ 2019-10-10 20:36 浩月星空 阅读(125) 评论(0) 推荐(0) 编辑
摘要: Nodejs基于事件机制以及回调函数实现异步编程 回调与异步: 回调不等于异步,回调只是一个函数作为另一个函数的参数而已。一般实现异步的方式由setTimeout或SetInterval + 回调函数来实现。 此外很多API默认均是采用异步调用的方式实现。 代码设计模式: 1. 函数的返回值可以作为其他函数的参数,此外函数也可以作为其他函数的参数以实现回调函数嵌套,不过回调函数嵌套的层次太深会比较 阅读全文
posted @ 2019-10-10 20:35 浩月星空 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 0. 进程 Node进程主要用来控制处理自身进程运行环境和状态,也可创建新的进程以协同处理某些任务,此时充当调度器作用。 1. process全局对象,表示当前NodeJS自身进程的对象。 2. child_process子进程模块,可创建和控制子进程,child_process.spawn创建进程(三个参数分别为可执行文件路径、命令行参数、配置子进程的执行环境与行为),此外exec等API对其进 阅读全文
posted @ 2019-10-10 20:34 浩月星空 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 0. http http模块可支持服务器使用和客户端使用。 服务器端使用: http.createServer创建服务器对象,调用服务器对象的listen监听某端口,等待客户端请求;也是一种基于回调事件机制。 HTTP请求由请求头+请求内容组成,请求头与请求内容(请求体)间有个空行,在http接收请求回调函数中request参数对象可访问请求头数据以及请求内容。 HTTP响应由响应头+响应内容组成 阅读全文
posted @ 2019-10-10 20:33 浩月星空 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 0. fs模块文件读写 一般操作: fs.open打开文件 fs.read读文件 fs.write写文件 fs.fsync刷新内存缓存以写入文件(类似于C/C++语言的flush) fs.close关闭文件 文件读写: fs.writeFile fs.writeFileSync(同步) fs.readFile fs.readFileSync(同步) 通过pipe管道读写数据流,用于大文件: fs. 阅读全文
posted @ 2019-10-10 20:32 浩月星空 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 0. node 命令行参数选项 1. 模块导出: exports与module.exports区别; module.exports 导出便是将要被导出的对象,exports则可认为是module.exports的引用对象(exports本身仅是一个空对象,此时用来声明接口)(两者均指向对一个对象的变量), 实际上被导出或者说被require的便是module.exports对象指向的对象,而exp 阅读全文
posted @ 2019-10-10 20:31 浩月星空 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 0. 小工具 npm: node第三方库管理工具,用来获取第三方包、升级、删除或发布编写的包。 nvm: node的多版本管理工具。 supervisor:监视你对代码的改动,重启当前执行的js文件,一般用在网站、web开发以实时修改并观察结果便于调试。 1. 事件 events内置模块,可注册事件监听器、触发指定的事件信号和相应的事件处理。 ... 阅读全文
posted @ 2019-10-10 20:28 浩月星空 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 23. Object对象 构造函数的参数若为对象,则返回原参数对象,指向同一个对象的引用(可基于此判断一个参数变量是否为对象即value===Object(value)); 构造函数的参数为原始数据类型,则返回包装后的对象。如Number、Boolean、String等,其中无参或参数为undefined或null均返回一个空对象。 添加新方法: 1. 通... 阅读全文
posted @ 2019-10-10 20:24 浩月星空 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 19. 运算符 加法运算符+: 1. 若运算子是对象,则自动转成原始类型值;此过程中先执行该对象的valueOf方法,若仍然 不是原始数据类型值,则再执行toString方法,若对象是Date实例,则执行toString方法。 2. 两个运算子都是原始类型的数据后,只要有一个为字符串,则运算子会转为字符串后执行字符串 的连接... 阅读全文
posted @ 2019-10-10 20:23 浩月星空 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 0. 语句 语句以";"结尾,但也可以省略,引擎解析器会自动添加必要的分号,不过此可能导致引入BUG。 1. 变量提升 因JavaScript引擎的工作方式,先解析代码,然后获取所有被声明的变量,然后再一行一行地运行; 在获取所有变量的声明时,变量声明类似于会被提升到代码的头部的操作。 例如: console.log(a); va... 阅读全文
posted @ 2019-10-10 20:22 浩月星空 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 请求发送方: 0. 一般可以采用fork一份某仓库(project-name)到自己的github 1. 克隆该自己的github下的该仓库到本地 git clone git@github.com:user-name/project-name.git 2. 创建本地仓库project-name的分支特性仓库(一般主流开发方式使用特性分支以及以特性分支提交Pu... 阅读全文
posted @ 2019-10-10 20:10 浩月星空 阅读(659) 评论(0) 推荐(0) 编辑
摘要: GitHub Flow 开发流程:以部署为中心 0. 始终保持master主干分支为可发布、部署的状态(这样可以时刻被创建特性分支或者可以被部署) 1. 新特性、作业或者修改BUG,从主干分支创建新的本地分支(该分支应具有描述性的名称),若该分支已存在,应先git pull更新为远程仓库master主干分支的最新状态 2. 确认在本地环境中通过所有测试,此后便可修改新建... 阅读全文
posted @ 2019-10-10 20:07 浩月星空 阅读(626) 评论(0) 推荐(0) 编辑
摘要: Git仓库维护: 0. Fork或者clone来的仓库,可能与原仓库源码不是最新的,需要时常更新以与原仓库一致 1. Fork某原仓库至github账户下 2. clone该Fork后的仓库至本地仓库 3. 给原仓库设置某个简易的名称,如update-project,并将其作为远程仓库;也即是以up 阅读全文
posted @ 2019-10-10 20:02 浩月星空 阅读(401) 评论(0) 推荐(0) 编辑
摘要: 一、RC资源的使用 资源相关 资源脚本文件:*.rc文件 编译器:RC.EXE 菜单资源的使用 1 添加菜单资源:通过菜单栏中插入(rc)菜单资源。或直接添加资源脚本到工程中。 2 加载菜单资源 2.1 在注册时设置菜单资源 2.2 加载菜单资源,设置到窗口 HMENU LoadMenu( HINS 阅读全文
posted @ 2019-10-10 13:29 浩月星空 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 软件优化的必要性; 1. 优化为软件开发的一部分 2. 优化是高效的且可持续的 3. 软件的活力、生命周期的延续 改善代码性能的一些策略: 1. 使用更好的编译器以及编译选项 2. 使用最优算法 3. 使用更好的库并用好库 4. 减少内存分配和复制操作 5. 移除不必要的计算操作,优化热点代码 6. 使用最优的数据结构 7. 提高并发性以更快地处理 8. 优化内存管理 影响优化的计算机的行为... 阅读全文
posted @ 2019-10-10 13:27 浩月星空 阅读(323) 评论(0) 推荐(0) 编辑
摘要: 在线程间划分工作的技术: 划分数据的方式:得到最优性能在很大程度上决定于数据结构的细节; 1、开始处理前的预先划分,最简单的做法便是划分数据给不同的工作任务, 也即将一个任务划分为多个并行的任务集,工作的线程独立运行这些任务,并在后期的化简步骤中合并结果。 2、递归地划分数据,避免产生过多的线程,但是线程间通信可能会带来复杂性。 划分任务... 阅读全文
posted @ 2019-10-10 13:26 浩月星空 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 无锁数据结构: 不使用锁就能实现安全并发地存取的数据结构,可避免数据竞争、死锁、或锁引起性能限制等,以实现最大程度的提高并发性。 设计正确的无锁或无等待的数据结构是比较困难的,若确定需要无锁的情况下产生的收益高于代价时才应考虑(这个需要在多各方面考虑)。 无锁数据结构优缺点: 优点: 1. 最大限度的提高并发性,减少了线程等待的时间; 2. 提高健壮性,避免锁机制引入可能导致的数据结构损坏。 缺点 阅读全文
posted @ 2019-10-10 13:25 浩月星空 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 数据结构: 作为程序设计问题中的关键部分,并行程序设计问题也需要处理数据结构,数据结构本身要么不需要同步,要么通过同步机制来保障如互斥体、锁等; 并发设计含义: 多个线程可同时使用此数据结构且执行相同或不同的操作,满足每个线程针对数据结构有一致性的视图,不会破坏或者丢失数据等竞争条件,则为线程安全的。 数据结构的操作接口中若抛出了异常,但并没有修改数据结构,则认为是异常... 阅读全文
posted @ 2019-10-10 13:24 浩月星空 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 内存模型: C++内存位置布局,参见struct结构体/class类成员/全局、静态变量在内存中的布局。 多个线程修改某位置的值,应按照某个顺序修改或者读取,否则可能出现数据竞争或未定义行为。 原子操作: 类似于事务操作,对对象值的修改或者读取都是原子的,不会出现修改部分或读取到失效值的情况。 标准原子类型std::atomic模板类型,提供了多个内置类型的特化... 阅读全文
posted @ 2019-10-10 13:23 浩月星空 阅读(558) 评论(0) 推荐(0) 编辑
摘要: 等待事件: 条件变量等待: std::condition_variable/std::condition_variable_any,前者配合std::mutex以及std::unique_lock、std::lock_guard, 后者可配合类似互斥体(包括互斥体)的类型工作,不过因其内部持有std::mutex对象成员的锁保护,性能和大小上会有一定的代价。 ... 阅读全文
posted @ 2019-10-10 13:22 浩月星空 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 竞争条件: 进程中各个线程可共享数据,既是优点也是缺点,而导致不同线程操作数据出现异常的情况时,竞争条件是其中之一。 避免竞争条件: 一:采用保护机制,封装正在修改的或访问的数据结构,确保其他线程在共享数据被修改前或修改后才可见可访问。 二:修改数据结构设计、或者使用不变量,如无锁编程(无锁数据结构等)。 互斥体保护: 互斥体作为同步原语,可确保一个线... 阅读全文
posted @ 2019-10-10 13:21 浩月星空 阅读(264) 评论(0) 推荐(0) 编辑