自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

amoscykl的博客

凡有成者,必务于实。凡有所学,皆成性格。

  • 博客(94)
  • 收藏
  • 关注

原创 muduo源码分析:Reactor模式的封装实现

关于muduo实现的Reactor模式,有三个关键的类:1.事件分发器类Channel2.封装I/O复用的Poller (主要研究EpollPoller)3.定时器接口类TimerQueue事件循环EventLoop类实现了Reactor的基本模式。 1.事件分发类Channel事件分发器Channel的数据成员如下://定义事件类型变量 s...

2018-10-31 01:24:17 559

原创 muduo源码分析:EventLoop类 (核心)

4.EventLoop类的实现EventLoop类实现了reactor的基本模式 ,它的数据定义如下: void abortNotInLoopThread(); //不在主I/O线程 void handleRead(); // waked up //将事件通知描述符里的内容读走,以便让其继续检测事件通知 void doPendingFunctors(); ...

2018-10-31 01:21:28 1035

原创 muduo源码分析:Poller类 (EpollPoller类)

2.I/O复用类PollerPoller类是个基类,它的定义如下:class Poller : boost::noncopyable { public: typedef std::vector<Channel *> ChannelList; Poller(EventLoop *loop); ...

2018-10-31 01:19:04 468

原创 muduo源码分析:Channel类 (事件分发器)

事件分发类Channel事件分发器Channel的数据成员如下://定义事件类型变量 static const int kNoneEvent; //无事件 static const int kReadEvent; //可读事件 static const int kWriteEvent; //可写事件...

2018-10-31 01:08:30 2210

原创 boost::bind()详解

使用boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式。其可以支持函数对象、函数、函数指针、成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置。 1. 通过functions和function pointers使用bind给定如下函数:int f(int a, int b){ return a + ...

2018-10-25 20:50:18 667

原创 boost::function用法详解

今天学习muduo网络库源码的时候看到了boost::function,写篇笔记记录下。 书上是这样描述的:function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛华,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此,它可以被用于回调机制,暂时保管函数或函数对象,在之后需要的时机在调用,使回调机制拥有更...

2018-10-25 20:36:47 2028

原创 muduo网络库——Buffer类的设计与使用

muduo Buffer设计要点:1.一块连续的内存(char *p, int len)。2.size()可以自动增长,以适应不同大小的消息。3.内部以std::vector<char>来保存数据,并提供相应的访问函数。 Buffer像一个queue,从末尾写入数据,从头部读出数据。TcpConnection会有两个Buffer成员:input buffer, o...

2018-10-23 10:46:21 897

原创 muduo网络库——实现Boost.Asio聊天服务器:完整代码+注释

聊天服务一个服务端进程可以同时服务多个客户端,客户端接受键盘输入,以回车为界把消息发送给服务端,服务端收到消息之后,依次发送给每个连接到它的客户端,原来发送消息的客户端进程也会收到这条消息。 消息格式每条消息有一个4字节头部,以网络序存放字节序长度。比如两条消息“hello”和“chenshuo": 打包的代码把string message打包为muduo::net...

2018-10-22 23:33:32 2058

原创 muduo网络库——五个简单编程示例

 五个简单TCP示例:echo, discard, chargen, daytime, timeecho:回显服务,把收到的数据发回客户端。discard:丢弃所有收到的数据。chargen:服务端accept连接之后,不停地发送测试数据。daytime:服务端accept连接之后,以字符串形式发送当前时间,然后主动断开连接。time:服务端accept连接之后,以二进制形...

2018-10-22 09:59:16 4649

原创 常见的并发网络服务程序设计方案

摘要陈硕老师的“Linux多线程服务端编程 - 使用muduo C ++网络库”12种并发服务器模型,特整理于此,备学习使用。       方案0:接受+读/写一次服务一个客户      这个不是并发服务器。      方案1:接受+ fork()进程每个连接      这个是传统的UNIX并发网络编程方案,也叫过程每次connextion。这种方案适合并发连接数不...

2018-10-21 23:59:31 627

原创 muduo网络库——简介:安装、目录结构

6.2安装#安装cmakesudo apt-get install cmake #安装boostsudo apt-get install libboost-dev libboost-test-dev#三个非必须的依赖库:curl、c-ares DNS、Google Protobuf (安装之后cmake会自动多编译一些示例)sudo apt-get install li...

2018-10-21 16:40:06 1983 1

原创 muduo网络库的安装、编译和使用

github项目地址https://github.com/chenshuo/muduo 安装:#安装cmakesudo apt-get install cmake #安装boostsudo apt-get install libboost-dev libboost-test-dev#三个非必须的依赖库:curl、c-ares DNS、Google Protobuf...

2018-10-19 17:19:38 4351

原创 LeetCode 169.Majority Element (求众数)

题目描述:给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2  AC C++ Solution:方案1:一目了然,不用多解释。class Solu...

2018-10-18 22:27:44 148

原创 LeetCode 168.Excel Sheet Column Title (Excel表列名称)

题目描述:给定一个正整数,返回它在 Excel 表中相对应的列名称。例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB ...示例 1:输入: 1输出: "A"示例 2:输入: 28输出: "AB"...

2018-10-18 22:22:22 306

原创 LeetCode 167.Two Sum II - Input array is sorted (两数之和 II - 输入有序数组)

题目描述:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 1...

2018-10-18 22:16:16 198

原创 LeetCode 165.Compare Version Numbers (比较版本号)

题目描述:比较两个版本号 version1 和 version2。如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。你可以假设版本字符串非空,并且只包含数字和 . 字符。 . 字符不代表小数点,而是用于分隔数字序列。例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五...

2018-10-18 22:12:04 151

原创 LeetCode 164.Maximum Gap (最大间距)

题目描述:给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。示例 1:输入: [3,6,9,1]输出: 3解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。示例 2:输入: [10]输出: 0解释: 数组元素个数小于 2,因此返回 0。说明:...

2018-10-18 22:03:51 216

原创 LeetCode 162.Find Peak Element (寻找峰值)

题目描述:峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。示例 1:输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值元素,你的函数应该...

2018-10-18 21:47:13 247

原创 LeetCode 160.Intersection of Two Linked Lists (相交链表)

题目描述:编写一个程序,找到两个单链表相交的起始节点。 例如,下面的两个链表:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3在节点 c1 开始相交。 注意:...

2018-10-18 21:22:04 137

转载 常见的多线程并发服务器设计模型

一、3点基础知识1、一个主机的端口号为所有进程所共享,但普通用户进程绑定不了一些特殊端口号如20、80等。 2、每个进程都有自己的文件描述符(包括file fd, socket fd, timer fd, event fd, signal fd),一般是1024,可以通过ulimit -n 设置,但所有进程打开的文件描述符总数有上限,跟主机的内存有关。3、一个进程内的所有线程共享进程的...

2018-10-18 15:57:10 426

原创 muduo网路库——高效的多线程日志

在服务端编程中,日志是必不可少的,通常用于故障诊断和追踪,也可用于性能分析。在生产环境中应该做到 "Log Everything All The Time"。 一个日志库大体可分为前端(frontend)和后端(backend)两部分。前端是供应用程序使用的接口(API),并生成日志消息;后端则负责把日志消息写到目的地。在多线程程序中,每个线程有自己的前端,整个程序共用一个后端。对于C...

2018-10-18 15:54:49 1147 1

原创 muduo网络库——C++多线程系统编程精要

4.1  基本线程原语的选用11个最基本的Pthreads函数是:2个:线程的创建和等待结束(join)。封装为muduo::Thread。4个:mutex的创建、销毁、加锁、解锁。封装为muduo::MutexLock。5个:条件变量的创建、销毁、等待、通知、广播。封装为muduo::Condition。 这三样东西(thread、mutex、condition)可以完成...

2018-10-18 00:10:56 1049

原创 LeetCode 155.Min Stack (最小栈)

题目描述:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。 top() -- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minSt...

2018-10-15 23:42:36 172

原创 LeetCode 154.Find Minimum in Rotated Sorted Array II (寻找旋转排序数组中的最小值 II)

题目描述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例 1:输入: [1,3,5]输出: 1示例 2:输入: [2,2,2,0,1]输出: 0说明:这道题是 寻找旋转排序数组中的最小值 的延伸...

2018-10-15 23:39:51 150

原创 LeetCode 153.Find Minimum in Rotated Sorted Array (寻找旋转排序数组中的最小值)

题目描述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0 AC C++ Solution...

2018-10-15 23:38:09 185

原创 LeetCode 152.Maximum Product Subarray (乘积最大子序列)

题目描述:给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 AC C++ Solution:很简洁的一种解决方法,一...

2018-10-15 23:36:55 142

原创 LeetCode 151.Reverse Words in a String (翻转字符串里的单词)

题目描述:给定一个字符串,逐个翻转字符串中的每个单词。示例:  输入: "the sky is blue",输出: "blue is sky the".说明:无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。进阶: 请选用C语言的用户尝试使用 O(1) 空...

2018-10-15 23:34:51 277

转载 muduo库整体架构简析

  muduo是一个高质量的Reactor网络库,采用one loop per thread + thread pool架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范。  muduo的代码分为两部分,base和net,base部分实现一些基础功能,例如log, thread, threadpool, mutex, queue 等,这些基础模块在后面网络库中很多地方都可以复用, bas...

2018-10-14 00:20:24 1192

原创 TCP/IP--IP协议相关技术:ARP地址解析协议与DNS解析

ARP(Address Resolution Protocol)地址解析协议ARP协议是辅助链路层传输的,在已经知道下一站路由器的IP地址后,要将以太网包发送给目的地址,但是以太网需要的是目的mac地址不是IP地址,而通过ARP请求包就可以获得目的IP地址的mac地址。ARP请求的过程:源主机以广播的形式,发送一个ARP请求包,所有与源主机在直连的主机都会收到一个请求包,如下图所示,请求...

2018-10-12 23:40:00 343

原创 LeetCode 150.Evaluate Reverse Polish Notation (逆波兰表达式求值)

题目描述:根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3) ...

2018-10-12 10:38:02 181

原创 LeetCode 148.Sort List (排序链表)

题目描述:在O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5AC C++ Solution:归并排序...

2018-10-12 10:34:03 141

原创 LeetCode 147.Insertion Sort List (对链表进行插入排序)

题目描述:对链表进行插入排序。插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。 插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的...

2018-10-12 10:17:42 132

原创 LeetCode 145.Binary Tree Postorder Traversal (二叉树的后序遍历)

题目描述:给定一个二叉树,返回它的 后序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] AC C++ Solution:堆栈迭代解法:/** * Definition for a binary tree node. * struct TreeNode { * in...

2018-10-12 10:13:49 165

原创 LeetCode 144.Binary Tree Preorder Traversal (二叉树的前序遍历)

题目描述:给定一个二叉树,返回它的 前序 遍历。 示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] AC C++ Solution:不用多解释,看代码。 堆栈迭代解法:/** * Definition for a binary tree node. * struct Tree...

2018-10-12 10:10:09 173

原创 LeetCode 143.Reorder List (重排链表)

题目描述:给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4-&...

2018-10-12 10:02:49 119

原创 LeetCode 142.Linked List Cycle II (环形链表 II) 详解

题目描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。说明:不允许修改给定的链表。进阶:你是否可以不用额外空间解决此题?  AC C++ Solution:解题思路:还是使用两个指针,一个fast,每次移动两步;一个slow,每次移动一步。                   a           b         ...

2018-10-12 09:57:45 244

原创 LeetCode 141.Linked List Cycle (环形链表)

题目描述:给定一个链表,判断链表中是否有环。进阶:你能否不使用额外空间解决此题?  AC C++ Solution:解题思路:使用两个指针,一个指针一次走两步(fast),另一个一次走一步(slow);若链表中有环,则两个指针迟早会遇上!代码:/** * Definition for singly-linked list. * struct ListNo...

2018-10-12 09:41:33 119

原创 为什么C++中stack的pop()函数不返回值而返回void

C++中stack,其中有两个方法:pop(), 返回void,top(),返回栈顶的引用。看起来pop函数非常的浪费,为什么pop不再是返回值呢。我收集到两个原因:1.安全原因:假设有这个stack类class Stack{    public:    T pop();    //let pop to change the stack's internal...

2018-10-12 09:35:57 5227 2

原创 LeetCode 139.Word Break (单词拆分)

题目描述:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leet...

2018-10-10 23:24:18 261

原创 LeetCode 137.Single Number II (只出现一次的数字 II)

题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,3,2]输出: 3示例 2:输入: [0,1,0,1,0,1,99]输出: 99  AC C++ Solution:解题思路:基本...

2018-10-10 23:14:04 143

空空如也

空空如也

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

TA关注的人

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