
编程语言
文章平均质量分 76
自己工作中用到的语言
整理使用过程中遇到的问题,可以精进的方面,让工具更好得体现它本身的价值。
z_stand
远离颠倒梦想,究竟涅槃
展开
-
关于 智能指针 的线程安全问题
智能指针是非线程安全的,多线程下修改共享的智能指针的时候需要有同步机制原创 2021-09-04 09:57:55 · 4859 阅读 · 3 评论 -
关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题
并发场景下 std::string 动态扩容引入的内存泄漏问题原创 2021-09-02 22:41:17 · 1172 阅读 · 0 评论 -
Clion 远程开发 配置
Clion 远端开发配置方式,节省看官时间。原创 2021-02-27 15:31:18 · 5806 阅读 · 0 评论 -
Go 分布式学习利器(16) -- go中可复用的package构建
通过本文,你将了解go 语言中如何将自己的package构建到项目中 以及如何将远程(github)的package构建到项目中。1. 构建本地的packagepackage 是可复用模块的基本单元,以首字母大写的函数实现来表明可被包外代码访问代码的package可以和所在路径的代码不一致同一目录里的Go 代码的package 要保持一致个人理解 本地包就像是C++/C中的头文件,其他代码只需要包含该头文件,即可使用头文件中生命的函数。这里构建自己Go语言的package的时候需要注意代码路原创 2020-12-13 13:49:20 · 271 阅读 · 0 评论 -
Go 分布式学习利器(9)-- Go语言 结构体的行为定义和实现
1. Go语言 的面向对象 -- 封装特性2. Go语言 中行为的定义,通过指针方式声明可以避免一次内存拷贝.原创 2020-11-18 23:12:28 · 261 阅读 · 0 评论 -
Go 分布式学习利器(8)-- Go的函数
1. Go语言中的函数(支持多返回值,函数可以作为入参、出参、返回值来实现 函数模版)都是值传递2. Go函数中的可变长参数 使用3. Go函数中的延迟函数 deffer使用原创 2020-11-18 22:18:29 · 226 阅读 · 0 评论 -
Go 分布式学习利器(7)-- 字符串
1. Go语言中 string的声明,unicode和utf-8的区别,string的遍历方式2. Go 语言 string的字符串分割和拼接函数Split和Join,字符串转整数Atoi和整数转字符串函数Itoa原创 2020-11-18 15:40:53 · 191 阅读 · 0 评论 -
Go 分布式学习利器(6)-- Map
1. Go语言的Map 声明,元素访问带来的0值问题,元素的遍历2. 通过Map实现函数模版 和 简单Set 的基本操作原创 2020-11-17 22:37:11 · 213 阅读 · 0 评论 -
Go 分布式学习利器(5)-- 数组和切片
1. Go语言的数组 ,多维数组 及 其初始化方式2. Go 语言 数组遍历方式3. GO语言 切片结构的用法,基本实现,以及 切片和数组的区别原创 2020-11-17 00:08:58 · 388 阅读 · 0 评论 -
Go 分布式学习利器(4)-- 条件和循环
Go语言的循环语句:没有两个小括号,且只有一个for关键字Go语言的条件语句if..else..语句1. condition 表达式结果必须为bool2. 支持表达式的变量赋值,并取结果进行判断Go的switch语句 差异较多1.条件表达式不限制为常量或者整数(可以是如上案例 字符串的形态)2. 单个case 中可以出现多个结果选项,使用逗号分隔3. Go 语言不需要break明确退出一个case4. 可以不设定switch 之后的条件表达式,这种结构与if...else...相同原创 2020-11-15 08:29:21 · 195 阅读 · 0 评论 -
Go: 分布式学习利器(3) -- Go的数据类型和运算符
Go的数据类型:1. 基本类型不允许进行隐式类型转化2.不支持指针类型的运算3. string是值类型,默认初始化值为空字符串Go的运算符:1.不支持前置 ++,--2. 支持通过==进行数组的比较(需要相同个数元素的数组才可以比较)3. Go语言支持 按位置零 &^原创 2020-11-14 14:37:51 · 230 阅读 · 0 评论 -
Go: 分布式学习利器(2)-- Go中的变量,常量 以及与其他语言变量之间的差异
通过本小节能够知道 1. go 测试程序模版2. go 的变量定义和声明方式3. go快速初始化连续常量的有趣方式原创 2020-11-12 22:22:18 · 244 阅读 · 0 评论 -
Go:分布式学习利器(1) -- 开发环境搭建 + 运行第一个go程序
学无止境,路漫漫兮其修远。努力通过go的学习 高效完成 MIT 6.824的不同lab也借此机会了解一下:简单,高效,云计算语言,区块链语言的 go是如何成长为如此受欢迎的语言。原创 2020-11-10 23:02:01 · 477 阅读 · 0 评论 -
python的popen函数
最近了解了一下python的popen函数的使用,主要是用来执行linux命令函数使用使用之前需要导入import os模块使用方式: os.popen(cmd)返回值: 返回一个文件句柄import oscmd="/sbin/partx /dev/sdb"result_list=os.popen(cmd)print result_list执行结果如下,返回了一个文件地址:...原创 2019-04-18 11:49:02 · 20424 阅读 · 0 评论 -
C++ 从双重检查锁定问题 到 内存屏障的一些思考
文章目录1. 问题描述2. DCLP 的问题 和 指令执行顺序2.1 Volatile 关键字2.2 C++11 的内存模型3. C++11内存模型 解决DCLP问题3.1 内存屏障和获得、释放语义3.2 atomic 的完整介绍3.2.1 原子操作的三种类型3.2.2 atomic 内存序3.2.3 atomic 成员函数1. 问题描述单例模式 是我们日常编码过程中比较常用的一种设计模式,用来对一个抽象进行限定,表示该类在当前程序生命周期内仅能创建一次,被整个进程空间共享。比如 FPGA处理单元在我原创 2020-10-08 11:51:55 · 1048 阅读 · 1 评论 -
使用 sched_setaffinity 将线程绑到CPU核上运行
linux 提供CPU调度函数,可以将CPU某一个核和指定的线程绑定到一块运行。这样能够充分利用CPU,且减少了不同CPU核之间的切换,尤其是在IO密集型压力之下能够提供较为友好的性能。通过sched_setaffinity 设置 CPU 亲和力的掩码,从而将该线程或者进程和指定的CPU绑定一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:CPU_ZERO() 清空一个集合CPU_SET()与CPU_CLR()分别对将一个给定的CPU号原创 2020-08-08 18:30:21 · 9556 阅读 · 0 评论 -
C++ lamda表达式 和 函数模版用法
前言本节将对函数对象,匿名函数对象(lamda表达式) 以及 匿名函数对象和 函数模版结合对一些用法 做个笔记。同时,分析以下lamda表达式相比于传统函数对象的优劣。关键是看一些 rocksdb类似的经典C++项目,老是有些细节get不到,导致最终理解的设计思想和实际的实现有差异。所以将这些高阶语法 再系统过一遍,加深对源码的理解。函数对象函数对象在C++98的时候已经比较成熟了,先看一段代码struct adder { adder(int n) : n_(n) {} int原创 2020-08-02 16:52:45 · 1381 阅读 · 1 评论 -
google gflags的参数解析,便捷实用
命令行参数解析,一直是我们后段开发人员需要经常使用的一个功能,用来从终端解析接口的输入 ,并做出对应的处理。这里为使用C++/python的开发人员推荐一个便捷的命令行解析接口集 gflags。我们之前使用C的getopt/getopt_long 函数需要自己使用其接口并编写大量的周边代码达到解析参数的目的,如果转到C++还使用上面的函数,代码会过于冗余。那么gflags就很好的解决了这个问题,我们不需要再数着冒号 "a????️cd:"添加参数了,不需要为每个传入的参数做类型转化。接下来的gflags原创 2020-06-28 22:45:41 · 751 阅读 · 0 评论 -
C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析
文章目录前言deque 实现deque类_Deque_iterator 类deque 的元素插入 insert函数deque如何模拟空间连续queue 实现stack 的实现前言C++容器中 deque是一个非常有趣的容器结构,我们知道deque本身是一个支持双向扩容的结构,对外表现出连续的存储方式。本节将从它的内部实现抽丝剥茧,看看STL 团队的deque以及通过deque实现的queue和stack适配器的有趣实现。关于deque 支持的基本接口如下:push_back()push_fr原创 2020-06-25 22:45:34 · 1126 阅读 · 0 评论 -
C++ STL: 容器vector源码分析
文章目录前言vector的核心接口vector push_back实现vector 的 Allocatorvector 的 push_back总结前言vector 是我们C++STL中经常使用的一个容器,提供容量可以动态增长,并且随机访问内部元素的数据存储功能。这个容器我们最常使用,所以也是最为熟悉的一种容器。通过它来看STL的源码设计,以及STL六大组件之间的搭配使用,可以让我们对C++这种语言,对优秀的编码设计,对有趣的数据结构和算法都能有深刻的理解和认识。STL六大组件关系如下:其中容器原创 2020-06-21 01:43:09 · 1404 阅读 · 0 评论 -
C++ STL: lower_bound 和 upper_bound
接口声明以下有两个不同的版本lower_boundtemplate <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);template <class ForwardIterator, class T, clas原创 2020-06-18 20:46:37 · 417 阅读 · 0 评论 -
Linux创建线程时 内存分配的那些事
文章目录问题描述问题分析针对问题1 的猜测:针对问题2 的猜测:原理追踪总结问题描述事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况。分析结果时发现一个有趣的事情,top看到的实际物理内存只有几兆,但是pprof统计的内存信息缺达到了几个G。很明显是创建线程时产生的内存分配,且最终的分配函数是__pthread_create_2_1,这是当前版本glibc创建线程时的实现函数,且在该函数内进行线程空间的分配。查看进程代码,发现确实有大量的线程创建,我们知道线程是有自己独原创 2020-05-30 21:23:45 · 3352 阅读 · 0 评论 -
设计模式 之美 -- 代理模式
文章目录1. 解决问题2. 应用场景1. 业务系统的非功能性开发2. 代理模式在RPC、缓存中的应用3. 实现C++实现C语言实现1. 解决问题客户端和目标对象之间需要进行交互,此时客户端类和目标对象类相关操作之间的逻辑如果交合在一起,会导致客户端和目标对象模块耦合度升高,后期扩展客户端的功能时,则需要修改两者的源代码。这样的架构设计在系统更加庞大(网络通信链路庞杂,功能增删频繁)的场景下,...原创 2020-04-26 21:41:20 · 266 阅读 · 0 评论 -
C++ 智能指针(unique_ptr / shared_ptr)代码实现
文章目录unique_ptr 智能指针的实现shared_ptr 智能指针的实现指针类型转换unique_ptr 智能指针的实现一个对象只能被单个unique_ptr 所拥有。#include <iostream>using namespace std;/*增加模板类型,保证智能指针的类型是由传入的类型决定的*/template <typename T>...原创 2020-04-23 22:22:56 · 634 阅读 · 0 评论 -
设计模式 之美 -- 建造者模式
文章目录1. 解决问题2. 应用场景3. 实现C语言实现C++实现4. 缺点1. 解决问题描述如下场景:类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的可读性,同时校验初始化参数列表是否有效的逻辑也无处放置假如初始化列表中的参数有一定的依赖关系,比如数据成员max 一定比 数据成员min 小才行,这样的依赖关系设置逻辑无处安放(需要在类实例化的时候就要完成依...原创 2020-04-22 23:10:59 · 257 阅读 · 0 评论 -
编程模式 之美 -- 抽象工厂模式
文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点1. 解决问题在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的问题。但是又凸显了新的问题,假如现在优衣库这个大工厂 里面需要生产不同的...原创 2020-04-21 23:07:50 · 393 阅读 · 0 评论 -
shell --- awk规范 系统总结
文章目录awk和sed的区别awk脚本的流程控制awk 记录和字段字段的引用awk表达式赋值操作符算数操作符系统变量(awk本身自定义的系统变量)关系操作符布尔操作符awk 条件和循环条件语句循环awk 的数组数组的定义数组的遍历删除数组举例,编写awk脚本文件`avg.awk`命令行参数数组复杂数组的使用案例awk和sed的区别awk更像是脚本语言awk用于“比较规范”的文本处理,用于统...原创 2020-04-18 16:12:04 · 499 阅读 · 0 评论 -
linux的 计划任务机制,自己带节奏
文章目录1. 解决问题2. 计划任务分类3. 一次性计划任务实现添加计划步骤注意事项4. 周期性计划任务实现`cron`和`crontab`命令5. 延时计划任务6. `flock`脚本加锁,保证单实例运行1. 解决问题环境中有脚本需求,周期性运行或者固定时间运行脚本,为了保证脚本的正常运行以及不会有冲突,可以增加计划任务来保证脚本在指定时间,正常顺利运行。2. 计划任务分类一次性计划任...原创 2020-04-17 21:29:02 · 264 阅读 · 0 评论 -
shell --- trap 抓取信号
1. 解决问题针对部分运行在生产环境中的脚本来说,有一些脚本运行的过程是不能被中断的,比如:生产环境 定期备份脚本,为了保证备份安全,备份期间不能被 SIGTERM和SIGINT 之类的中断信号中断。该种类型的脚本逻辑增加抓取信号的命令,从而保证脚本的运行不会被中断。trap命令即可提供该功能,trap 命令能够抓取除 -9 信号之外的命令,SIGKILL信号是不能被阻塞的2. 应用场景...原创 2020-04-17 21:26:42 · 375 阅读 · 0 评论 -
C++ 互斥锁和条件变量实现读写锁
最近的诸多面试经历确实让自己发现内功还不够,还需要持续的学习精进。实现如下:class RWLock{ private: int state; mutex mu; condition_variable cond; public: RWLock():state(0){} void rlock(){ mu.lock(); while(state < 0){ ...原创 2020-02-25 18:35:19 · 1305 阅读 · 0 评论 -
C++ 技能树(持续更新)
相关xmind的原始文件已上传至mind-Mapping github,如有需要可自行下载,欢迎批评指正关于分布式存储的整体技能的学习历程 可以参考分布式存储技能图谱,仅为个人的技能学习框架...原创 2020-01-05 10:56:44 · 2601 阅读 · 0 评论 -
贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数以及跳跃过程的路径(以数组下标标识)例如:nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4; 最少跳跃次数为2,跳跃路径为[0...原创 2019-11-06 13:30:15 · 901 阅读 · 0 评论 -
贪心:Jump Game 跳跃游戏
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数例如:nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4;nums = [3, 2, 1, 0, 4] ,不可以从nums[0...原创 2019-11-06 00:22:50 · 482 阅读 · 0 评论 -
C++的 STL堆 实现获取中位数
前言堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆最大堆即 堆顶元素为堆中最大的元素最小堆即 堆顶元素为堆中最小堆元素如下为一个最大堆中位数:一组数排序后,如果元素个数如下奇数个数n:(int) n/2 的数偶数个数n: (int) n/2 和(int) n/2 +1的平均数同样此时想要获取一组数列中的中位数,且同样使用时间复...原创 2019-11-03 14:11:05 · 1937 阅读 · 0 评论 -
C++的STL 堆 实现获取数组堆第K大的数
前言堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆最大堆即 堆顶元素为堆中最大的元素最小堆即 堆顶元素为堆中最小堆元素如下为一个最大堆回到文章标题,获取一个数组中第K大的数,要求时间复杂度是O(n),即一次遍历即可获取到该值。所以普通的先排序,再获取第k个数值的方式显然不满足要求,排序最快的快速排序也需要O(log2 n)这里就是我...原创 2019-11-03 13:41:06 · 1068 阅读 · 0 评论 -
C++的STL 栈 实现四则运算
使用栈实现四则运算,支持+,-,*,/,(,)输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出这个实现借用了栈以及字符处理状态机的思想:维护两个栈:一个用于数值,另一个用于存放计算符号字符状态机用于遍历输入的字符串过程中进行对应数值处理和计算符号处理的状态转换在第一个思想中:符号栈中存在优先级,即*和/的优先级高于+和-,同时括号的优先级高于*和/,所以符号栈的入...原创 2019-11-02 20:21:17 · 811 阅读 · 0 评论 -
C++的STL 栈实现 判断栈的出栈顺序是否合理
有这样的题目:已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?类似如下:已知栈的出栈序列为:3 2 5 4 1,判断该栈的出栈序列是否合法过程如下:第一次1-5顺序入栈:1,2,3第二次 3 出栈:1,2第三次 2 出栈:2第四次 4,5 入栈:1,4,5第五次 5 出栈:1,4...原创 2019-11-02 19:16:27 · 852 阅读 · 0 评论 -
C++的STL栈实现获取栈中最小元素的成员
实现一个获取栈中最小数据成员的函数,该栈支持如下操作:1.push(x) : 将元素x压入栈中2.pop() : 弹出(移除)栈顶元素3.top() : 返回栈顶元素4.getMin() : 返回栈内最小元素要求时间复杂度为O(1)这里关键是如何获取最小值,栈中的元素不断增加,且要达到O(1)常数级的时间复杂度,即创建好的栈进行排序,返回最小值是不可行的。这里只有在创建过程中将栈中的...原创 2019-10-31 01:07:56 · 915 阅读 · 0 评论 -
C++的STL栈实现队列
使用内部存储结构为栈的方法实现一个队列,要求实现该队列的如下方法:1.push(x) : 将元素x压入队列中2.pop() : 弹出(移除)队列头部元素3.peek() : 返回队列头部元素(即为front)4.empty() : 判断队列是否是空栈的数据结构为先入后出,队列的数据结构为先入先出使用栈来实现队列,同样想要让两者弹出的数据保持一直,内部的数据存储顺序是相反的;可行的办法...原创 2019-10-31 00:54:27 · 451 阅读 · 0 评论 -
C++的STL队列实现栈
使用C++的队列STL实现一个栈的数据结构实现以下四个函数:1.push(x) : 将元素x压入栈中2.pop() : 弹出(移除)栈顶元素3.top() : 返回栈顶元素4.empty() : 判断栈是否是空队列的数据结构为先入先出,栈的数据结构为先入后出;即队列的元素顺序与栈中元素的顺序是相反的,所以只需要保证后面插入的元素是在前面的元素之前能够被弹出即可。转换成栈之后的存储...原创 2019-10-31 00:45:43 · 338 阅读 · 0 评论