自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 双buffer防止 map读写并发

package mainimport ( "fmt" "strconv" "sync")var ( s [2]map[string]string current = 0 wg sync.WaitGroup)func w(s1 string) { tmpIndex := (current + 1) % 2 if s[tmpIndex] == nil { s[tmpIndex] = make(map[string]string) } s[tmpInd

2022-04-21 18:49:47 719

原创 range遍历 channel 的小坑

//package main////import (// "fmt"// "reflect"//)////type Person struct {// Name string// Age int// Sex string//}////type tool struct {// cap string// key string//}////func (t *tool) print() {// fmt.Println(t.cap, t.key)//}////func

2022-04-12 17:18:36 572

原创 STL map的value为类对象引发的构造函数

class Test{public: int a_; Test() { printf("默认构造函数 %p\n", this); } Test(int a){ printf("构造函数 %p\n", this); a_=a;} Test(const Test &test) { printf("拷贝构造函数 %p %p\n", this, &test); }

2021-11-20 17:14:09 807

原创 LintCode-三数之和

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。class Solution {public: /** * @param numbers: Give an array numbers of n integer * @return: Find all unique triplets in the array which gives the sum of zero. */ vector<vect

2020-10-18 12:46:59 152

原创 LintCode-数组划分

31、数组划分给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:所有小于k的元素移到左边所有大于等于k的元素移到右边返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。class Solution {public: /** * @param nums: The integer array you should partition * @param k: An integer * @ret

2020-10-18 12:07:00 242

原创 双buffer 无损切换

在实际工作中,经常会遇到这种情况:一些配置文件可能面临更改,希望更改完成后动态加载到进程中。要做到此,需要注意两个方面:1.不断监测文件是否修改,如果有修改,则启动更新2.如果配置文件在程序中对应的变量,一直会被访问,那么需要加锁进行,更新配置的时候可以占有锁进行更新操作,可以用读写锁实现。如果并发量非常大,那么在更新配置时,会对性能有一定的影响。 这里我实现了一种利用双buffer进行切换的机制来避免锁的使用,具体是: 1)进程运行时,访问一个配置对象, 2)同时另一个线程监测

2020-08-23 13:45:01 1108

原创 C++项目中使用thrift对于optional中存在的坑

11111

2020-08-22 10:02:44 2270

原创 cmake和makefile的使用

一、cmake的安装cmake下载地址:https://cmake.org/download/选择Tools–>How to install Fow Command Line Usesudo "/Applications/CMake.app/Contents/bin/cmake-gui" --installcmake --version但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具(大多数IDE都有

2020-07-21 18:01:19 662

原创 go并发map - sync.Map

并发访问map是不安全的。所以如果希望在多协程中并发访问map,必须提供某种同步机制,常用的协程安全的访问map的方式:读写锁实现并发安全Map。一般情况下通过读写锁sync.RWMutex实现对map的并发访问控制,将map和sync.RWMutex封装一下,可以实现对map的安全并发访问。type M struct { Map map[interface{}]interface{} mu sync.RWMutex}//set mu.Lock() defer mu.

2020-07-21 10:17:33 533

原创 C/C++ gcc编译过程

C/C++程序编译流程: 预处理->编译->汇编->链接具体的就是:源代码(source coprede)→预处理器(processor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→链接器(Linker)→可执行程序(executables)gcc常用选项:选项功能-v查看gcc 编译器的版本,显示gcc执行时的详细过程-o指定输出文件名为file,这个名称不能跟源文件名同名-E只预处理,不

2020-07-18 21:45:33 379

原创 C++实现protobuf

一、配置protobuf开发环境二、创建 .proto 文件,定义数据结构//message.protosyntax = "proto2";package Message;message MessageTest{ required int64 dateTime = 1; required string hostName = 2; required string ip = 3; required string info = 4; // 字段规则:

2020-07-09 11:38:43 631

原创 C++11 线程池demo

线程池:一种线程的使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程池工作原理:1、主程序当前没有任务要执行,线程池中的任务队列为空闲状态.此情况下所有工作线程处于空闲的等待状态,任务缓冲队列为空.2、主程序添加小于等于线程池中线程数量的

2020-06-18 19:47:00 489 1

原创 go语言--继承

go语言通过组合实现继承type B struct { A}package mainimport "fmt"type A struct{ F1 int}type B struct { A}func (this *A)fun1(){ fmt.Println("fun1:a")}func (this *A)fun2(){ fmt.Println("fun2:a")}func (this *B)fun2(){ fmt.Println("fun2:b")}func

2020-05-27 20:20:46 219

原创 函数指针指向静态成员函数、非静态成员函数、普通函数的使用

#include<iostream>using namespace std;class Test{public: //静态成员函数 static void func1(int i) {cout<<++i<<endl;} //非静态成员函数 void func2(int i) {cout<<--i<<endl;}};//普通函数void func3(int i){ cout&l

2020-05-22 14:00:53 692 1

原创 C语言实现多态(函数指针)

函数指针函数指针的实现方法:typedef int (*func)(int,int)function<int(int,int)> func#include <stdio.h>#include <stdlib.h>typedef void(*FUNC)(); //定义一个函数指针来实现对成员函数的继承struct _Base //父类{ FUNC _fun;//由于C语言中结构体不能包含函数,故借用函数指针在外面实现 int _B1;

2020-05-20 11:05:09 1300

原创 Linux Crontab定时运行程序

1、Crond命令详解crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程其中:minute: 表示分钟,可以是从0到59之间的任何整数。hour:表示小时,可以是从0到23之间的任何整数。day:表示日期,可以是从1到31之间的任何整数。month:表示月份,可以是从1到12之间的任何整数。week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件ps:#每天11.

2020-05-10 16:00:28 302

原创 localtime-多线程不安全

#include<fstream>#include<iostream>#include <map>#include <unistd.h>using namespace std;void* Fun1(void *arg){ struct tm * tm= (struct tm*)arg; tm->tm_mday =...

2020-04-28 12:16:00 1134

原创 C++之RapidJSON解析json

{ "name":"zhangsan", "learn":{ "match":[ { "start":"08:00", "end":"10:00" }, { "start":"17:00", ...

2020-04-24 20:58:17 717

原创 C++因继承引起的内存消耗

#include<iostream>#include<vector>using namespace std;class A{public: int a; char c1; char c2;};//class B :public A{// char c2;//};int main(){ A a; cout&...

2020-04-19 20:09:11 267

原创 变量初始化顺序(静态变量、成员变量)

静态局部变量静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;静态成员变量C++中static成员变量的初始化顺序和声明的顺序不一致,和初始化语句的先后顺序...

2020-04-13 20:19:48 1241

原创 memcpy()、memset()注意事项

==【深度探索C++对象模型】==不管使用memcpy()还是memset(),都只有在“classes不含任何由编译器产生的内部members”时才能运行。如果这个类声明一个或者一个以上的virtual function,或者内含一个virtual base class,那么使用这两个函数将会导致那些“被编译器产生的内部members”的初值所改写。例如下面的声明:class Shape{ ...

2020-04-13 14:21:46 324 1

原创 c++为什么只能通过指针或引用实现多态,而不可以通过对象赋值实现

在c++的多态中,如果一个基类的虚函数被派生类重写,那么把基类的指针指向派生类,就能够通过基类调用被派生类重写的这个虚函数。(对于这点有疑问的,可以看我之前写的C++多态,虚函数,虚函数表,gcc下的单继承,多继承,虚继承的内存布局)。那么如果不用指针或引用会如何?#include<iostream>using namespace std;class Animal{public...

2020-04-01 17:21:29 1013

原创 父类指针可以指向子类对象,反之则不可以

class A{public: A(int a){ this->a=a; } int a;};class B:public A{public: B(int a,int b):A(a){ this->b=b; } int b;};A类占内存大小范围:int a; 占4个字节.B类占内存大小范围...

2020-04-01 15:31:18 1058 1

原创 RPC-Thrift与Protobuf比较

thriftThrift是一个跨平台的服务部署框架,最初是由Facebook开发的。Thrift通过一个中间语言( IDL,接口定义语言)来定义RPC接口和数据类型,然后通过一个编译器生成不同类型的代码(目前支持的语言有: C++,Java,Python,PHP, Ruby,Erlang…) ,并由生成的代码负责RPC协议层和传输层的实现。Thrift实质上是以C/S 模式来实现的,通过代码生...

2020-02-06 15:39:01 1162

原创 boost库学习-timer库

timer.hpp// boost timer.hpp header file ---------------------------------------------//// Copyright Beman Dawes 1994-99. Distributed under the Boost// Software License, Version 1.0. (See acco...

2020-02-06 11:53:14 315

原创 SQL解析Json字段

MySQL支持原生JSON类型,使用JSON数据类型相较于将JSON格式的字符串存储在String型中的优势有:存储时会自动验证JSON文本;可以优化存储格式。存储在JSON型中的JSON文本会被转换成一个支持快速读取的文档元素,这样在使用时不需要再解析文本,并且可以直接通过键和索引访问其中的子对象而无需读取全部文本。JSON型中可存储的JSON文本的大小不会超过mysql.ini配置文...

2020-01-19 19:18:16 31747 3

原创 Thrift协议(C++实现)

编写thrift文件student.thriftstruct Student{ 1: i32 sno, 2: string sname, 3: bool ssex, 4: i16 sage,}service Serv{ void put(1: Student s),}生成开发库thrift -r --gen cpp student.t...

2020-01-16 10:55:54 1029

原创 C++创建类对象的生命周期

全局对象在main开始前被创建,main退出后被销毁。#include <iostream>using namespace std;class A{public: A() { cout<<"执行构造函数"<<endl; } ~A(){ cout<<"执行析构函数"<<...

2020-01-10 16:50:38 1792

原创 C++标准指明析构函数不能、也不应该抛出异常

出现异常会执行析构函数C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的。C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函...

2019-12-31 15:55:23 422

原创 设计模式-迭代器模式

迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。该模式很好理解,C++中的迭代器应该都用过,和那个差不多。迭代器模式的UML类图:1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。3.集合角色(Aggregate)...

2019-12-22 11:58:21 93

原创 设计模式-解释器模式

解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。 2、一些重复出现的问题可以用...

2019-12-21 19:55:51 102

原创 设计模式-状态模式(C++)

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了类本身。状态模式主要解决的时当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。状态模式的UML类图:环境类(Context): 定义...

2019-12-21 19:42:22 121

原创 设计模式-访问者模式(C++实现)

访问者模式:分离对象的数据和行为,可以不修改已有类的情况下,增加新的操作角色和职责。表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间耦合解脱开,使得操作几何可以相对自由地演化。访问者模式的目的使要把处理从数据结构中分离出来。很多系统可以按照算法和数据结构分开,如果这...

2019-12-21 17:21:43 170

原创 设计模式-备忘录模式

备忘录模式:在不破坏分装性的前提下,保存对象的内部状态,并且在这个状态之外保存这个状态,这样可以以后恢复到这个状态。备忘录模式的UML类图:Memento:备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者只能看到备忘录的窄接口————它只能将备忘录传递给其他对象。相反,原发器能够看到一个宽接口...

2019-12-16 18:09:48 79

原创 设计模式-观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主与读者之间存在种一对多的依赖关系。观...

2019-12-03 11:09:50 100

原创 设计模式-中介者模式

中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解。中介者模式的UML类图:#include<iostream>using namespace std;class Mediator;//抽象人class Person{protected: Mediator ...

2019-12-03 10:11:06 89

原创 设计模式-策略模式

策略模式定义算法家族,分别封装。它们之间可以相互替换,让算法变化,不会影响到用户。优点:适合类中的成员方法为主,算法经常变动;简单了单元测试(因为每个算法都有自己的类,可以通过自己的接口单独测试)。缺点:客户端需要做出判断。策略模式的UML类图:#include <iostream>using namespace std;class Strategy//策略抽象类,定义所有...

2019-11-29 20:12:46 89

原创 C++ explicit和implicit (显示转换和隐示转换)

在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换。首先, C++中的explicit关键字只能用于修饰只有一个参数或只有一个未提供默认值的类构造函数, 它的作用是表明该构造...

2019-11-28 17:42:56 556

原创 C++中NULL和nullptr的区别

NULL在c++中是一个宏,是一个空指针常量,如果将NULL扩展为常数,那么这个数是0,类型为int。#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif在C语言中,NULL的定义为(void *)0,因为C语言可以隐式转换。但在C++中,int *p = (void ) 0这样的语句会报错,因为在C+...

2019-11-17 20:09:41 148

原创 设计模式-责任链模式

避免请求发送者和接受者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条连传递请求,直到有对象处理它为止。责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。优点:1.降低耦合度,它将请求的发送者和接受者解耦2.简化了对象,使得对象不需要知道链的结构3.增强给...

2019-11-17 19:49:44 92

空空如也

空空如也

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

TA关注的人

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