先占坑,总结到目前为止的所学和观点,留待日后学到新的知识或者有新的认知了再回来更新 (先吐槽,网上搜定时器和时间轮,那些博客的代码居然基本上都是Linux高性能上的,虽然我也是…感叹一下看来这本书很厉害,是不是目前讲这方面的书很少,只有它啊…) 定时器 定时器就是一个数据结构,他最主要的成员是回调函数和超时时间,等到超时时间到期,自动执行这个函数。 定时器的实现 单线程实现 单线程实现类似于在一个循环线程里用epoll和usleep等待接口实现超时回调 多线程实现 /* 日后再说 */ 时间轮 本质就是一个定时器容器,可以更具效率的管理定时器,下面贴的代码也是出自《Linux高性能》,以数组实现了一个时间轮,只有一个”轮子“ (1)定时器的简单实现 //升序定时器链表 #ifndef LST_TIMER_H #define LST_TIMER_H #include <netinet/in.h> #include <stdio.h> #inclu 继续阅读 >>


吕子健 18/05/24 22:38:52
源码 https://github.com/lzj112/C-Plus-Plus/tree/master/%E8%BD%AF%E4%BB%B6%E6%9D%AF/blockchain/test1 block.h定义区块数据结构 #ifndef _BLOCK_H_ #define _BLOCK_H_ #include <iostream> using namespace std; struct BlockHead //区块头 { string PreHash; //前一区块哈希 //string MrekleTreeRoot; 梅克尔树根哈希 string Data; //简化操作,Data表示数据,本应该是梅克尔树根哈希值 string TimeStamp; //时间戳 int Index; //索引 }; class Block : public BlockHead { public: //int size; //区块 继续阅读 >>


吕子健 18/05/18 18:02:35
为什么使用动态内存 程序不知道自己需要多少对象; 程序不知道对象的准确类型; 程序需要在多个对象之间共享数据; 动态内存在哪里 程序有静态内存、栈内存。静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建或销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁。 除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。程序用堆来存储动态分配的对象——即,那些在程序运行时分配的对象。动态对象的生存期由程序来控制,也就是说,当动态对象不再使用时,我们的代码必须显式的销毁它们。(c++ primer P400) 自由存储区和堆 自由存储是c++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区 堆是操作系统维护的一块内存 虽然c++编译器默认使 继续阅读 >>


吕子健 18/05/07 21:08:07
https://github.com/lzj112/C-Plus-Plus/tree/master/%E8%BD%AF%E4%BB%B6%E6%9D%AF/Merkle_Tree_test1 作者:weixin_36888577 发表于 2018/04/18 21:19:10 原文链接 https://blog.csdn.net/weixin_36888577/article/details/79997040 阅读:194 继续阅读 >>


吕子健 18/04/18 21:19:10
代码编译运行环境:VS2012+Debug+Win32 模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化。模板的实例化分为隐式实例化和显示实例化。 对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用)。对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显示指明模板实参。各个概念请勿混淆。 1.隐式实例化 1.1模板隐式实例化的定义 这是相对于模板显示实例化而言。在使用模板函数和模板类时,不存在指定类型的模板函数和模板类的实体时,由编译器根据指定类型参数隐式生成模板函数或者模板类的实体称之为模板的隐式实例化。 1.2函数模板隐式实例化 函数模板隐式实例化指的是 继续阅读 >>


吕子健 18/04/17 21:09:39
1.进程调度的功能 记录系统中所有进程的状态、优先数和资源的需求情况 确定调度算法。决定将CPU分配给哪个进程及多长时间 分配处理机给进程 2.进程调度方式 非抢占式 :直到进程完成或因为某时间而不能运行时,才将CPU分配给其他进程 。通常用在批处理系统中。主要优点是简单、系统开销小 抢占式 :当一个进程正在执行,系统可以基于某种策略剥夺CPU给其他进程。剥夺的原则有:优先权原则、短进程优先原则和时间原则。主要用于分时系统和实时系统,以便及时响应各进程请求 3.引进进程调度的时机 正在执行的进程正确完成/由于错误终止运行(陷阱和中断) 执行的进程提出I/O请求,等待其完成 分时系统中,进程时间片用完 按照优先级调度时,有更高的优先级进程变为就绪时(抢占方式) 发生阻塞(执行的进程执行了wait、阻塞原语和唤醒原语时) 4.进程调度算法的评价准则 1)面向系统的调度性能准则 吞吐量 处理及利用率 各个设备的均衡利用 2)面向用户的调度性能准则 周转时间 响应时 继续阅读 >>


吕子健 18/04/14 22:18:09
既然是队列那么先要包含头文件#include <queue> 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 定义:priority_queue<Type, Container, Functional> Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆 一般是: //升序队列 priority_queue <int,vector<int>,greater<int> > q; //降序队列 priority_queue <int,vector<int>,less<int> > 继续阅读 >>


吕子健 18/04/14 10:58:07
当我们重载了++这个自增运算符,那么在调用他的时候,编译器如何知道我们是调用了前缀自增还是后缀自增呢 #include <iostream> using namespace std; class tmp { private: int a; public: tmp(int b) { a = b; } tmp& operator++(); //这是前缀 const tmp operator++(int); //这是后缀 void show(); }; tmp& tmp::operator++() { this->a += 1; return *this; } const tmp tmp::operator++(int) { tmp old = *this; //先拿到自增前的值 this->a += 1; //再自增 return old; } void tmp::s 继续阅读 >>


吕子健 18/04/11 00:05:45
今天碰到一个报错 tree.cpp: In function ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’: tree.cpp:81:63: error: default argument given for parameter 2 of ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’ [-fpermissive] merkle_node* createMerkleNode(string data, bool isLeaf = false) ^ tree.cpp:20:14: note: previous specification in ‘merkle_node* createMerkleNode(std::__cxx11:: 继续阅读 >>


吕子健 18/04/09 20:23:13
使用命令 sudo apt-get install libssl-dev 安装libssl-dev即可 作者:weixin_36888577 发表于 2018/04/07 19:35:47 原文链接 https://blog.csdn.net/weixin_36888577/article/details/79844161 阅读:163 继续阅读 >>


吕子健 18/04/07 19:35:47