<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[田航语]]></title><description><![CDATA[从简单开始，需要耐心，注重细节]]></description><link>https://blog.youkuaiyun.com/henrytien</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; henrytien]]></copyright><item><title><![CDATA[Redis源码阅读 ae.c]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/129811637</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/129811637</guid><author>henrytien</author><pubDate>Tue, 28 Mar 2023 10:55:27 +0800</pubDate><description><![CDATA[Redis 使用事件驱动的方式实现 IO 多路复用，其核心是基于第三方库的事件循环库。Redis 支持多种事件循环库，包括：libeventlibevae (Redis 自带的事件循环库)其中，Redis 自带的事件循环库 ae 较为轻量级，且支持跨平台，因此 Redis 默认使用 ae 作为事件循环库。在 Redis 启动时，会创建一个事件循环对象，并注册一些必要的事件。事件循环对象中包含了一个事件池和一个定时器队列。是 Redis 中的一个事件循环库，是实现 Redis 事件驱动模型的核心。]]></description><category></category></item><item><title><![CDATA[threadpoll epoll implementing server]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/104056633</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/104056633</guid><author>henrytien</author><pubDate>Mon, 20 Jan 2020 21:54:08 +0800</pubDate><description><![CDATA[Introduction
The project uses Linux epoll and thread poll build the server and have a client demo.
the thread pool has two-part, one is buffer, like a message queue, use a producer-consumer model impl...]]></description><category></category></item><item><title><![CDATA[Bidirectional BFS双向BFS]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/103866290</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/103866290</guid><author>henrytien</author><pubDate>Mon, 06 Jan 2020 22:48:40 +0800</pubDate><description><![CDATA[from collections import deque

class Solution:
   
    def doubleBFS(start,end):
       
        if start == end:
            return 1 
         # 分别从起点和终点开始的两个队列
        startQueue,endQueue = deque()...]]></description><category></category></item><item><title><![CDATA[69. Binary Tree Level Order Traversal]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/103860649</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/103860649</guid><author>henrytien</author><pubDate>Mon, 06 Jan 2020 17:05:32 +0800</pubDate><description><![CDATA[/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this-&gt;val = val;
 *         this-&gt;left = this-&...]]></description><category></category></item><item><title><![CDATA[LintCode 137. 克隆图]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/103851205</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/103851205</guid><author>henrytien</author><pubDate>Mon, 06 Jan 2020 10:02:19 +0800</pubDate><description><![CDATA[克隆图
中文English
克隆一张无向图. 无向图的每个节点包含一个 label 和一个列表 neighbors. 保证每个节点的 label 互不相同.

你的程序需要返回一个经过深度拷贝的新图. 新图和原图具有同样的结构, 并且对新图的任何改动不会对原图造成任何影响.
Example
样例1
输入:
{1,2,4#2,1,4#4,1,2}
输出:
{1,2,4#2,1,4#4,1,2}
解...]]></description><category></category></item><item><title><![CDATA[Leetcode 5. Longest Palindromic Substring]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/103839249</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/103839249</guid><author>henrytien</author><pubDate>Sun, 05 Jan 2020 00:21:55 +0800</pubDate><description><![CDATA[Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example ...]]></description><category></category></item><item><title><![CDATA[c++ shared_ptr 智能指针循环引用问题]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80276537</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80276537</guid><author>henrytien</author><pubDate>Fri, 11 May 2018 08:56:02 +0800</pubDate><description><![CDATA[智能指针的循环引用

shared_ptr and weak_ptr differences

“循环引用”简单来说就是：两个对象互相使用一个shared_ptr成员变量指向对方的会造成循环引用。导致引用计数失效。下面给段代码来说明循环引用：



#include&amp;lt;iostream&amp;gt;
#include &amp;lt;memory&amp;gt;
using namespace std;
class...]]></description><category></category></item><item><title><![CDATA[构造函数或者析构函数中调用虚函数会怎么样？]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80064863</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80064863</guid><author>henrytien</author><pubDate>Tue, 24 Apr 2018 15:05:12 +0800</pubDate><description><![CDATA[
  简要结论： 
  １. 从语法上讲，调用完全没有问题。 
  ２. 但是从效果上看，往往不能达到需要的目的。 
  Effective 的解释是： 
  派生类对象构造期间进入基类的构造函数时，对象类型变成了基类类型，而不是派生类类型。 
  同样，进入基类析构函数时，对象也是基类类型。


所以，虚函数始终仅仅调用基类的虚函数（如果是基类调用虚函数），不能达到多态的效果，所以放在构造函数中...]]></description><category></category></item><item><title><![CDATA[c++ new 和 malloc 的区别]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80058983</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80058983</guid><author>henrytien</author><pubDate>Tue, 24 Apr 2018 06:59:31 +0800</pubDate><description><![CDATA[
new分配内存按照数据类型进行分配，malloc分配内存按照大小分配；  
new不仅分配一段内存，而且会调用构造函数，但是malloc则不会。new的实现原理？但是还需要注意的是，之前看到过一个题说int* p = new int与int* p = new int()的区别，因为int属于C++内置对象，不会默认初始化，必须显示调用默认构造函数，但是对于自定义对象都会默认调用构造函数初始化。
...]]></description><category></category></item><item><title><![CDATA[c++ 四种强制类型转换介绍]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80055512</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80055512</guid><author>henrytien</author><pubDate>Mon, 23 Apr 2018 20:08:20 +0800</pubDate><description><![CDATA[博文阅读，再次复习一下。0.0 
c++ 四种强制类型转换介绍]]></description><category></category></item><item><title><![CDATA[linux中fork（）函数详解（原创！！实例讲解）]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80045397</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80045397</guid><author>henrytien</author><pubDate>Mon, 23 Apr 2018 08:02:43 +0800</pubDate><description><![CDATA[博文阅读： 
 linux中fork（）函数详解（原创！！实例讲解） 
主要特性就是创建子进程会复制父进程的代码和空间。]]></description><category></category></item><item><title><![CDATA[题解 考察 虚函数 拷贝构造 赋值构造]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80040149</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80040149</guid><author>henrytien</author><pubDate>Sun, 22 Apr 2018 16:38:15 +0800</pubDate><description><![CDATA[输出什么：

#include &amp;lt;iostream&amp;gt;
using namespace std;

struct A {
    A() {
        local_var++;
    }
    virtual void func() {
        cout &amp;lt;&amp;lt; &quot;A&quot; &amp;lt;&amp;lt; endl;
    }
    static int local_var...]]></description><category></category></item><item><title><![CDATA[TCP长连接与短连接的区别]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80039164</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80039164</guid><author>henrytien</author><pubDate>Sun, 22 Apr 2018 15:13:56 +0800</pubDate><description><![CDATA[TCP长连接与短连接的区别]]></description><category></category></item><item><title><![CDATA[C++中虚函数表解析 很清晰]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80039120</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80039120</guid><author>henrytien</author><pubDate>Sun, 22 Apr 2018 15:09:45 +0800</pubDate><description><![CDATA[一、 什么是虚函数? 
C++ 虚函数表解析




C++中的虚函数的作用?
虚函数表
安全性









C++中的虚函数的作用?


  C++中的虚函数的作用主要是实现了多态的机制。关于多态，简而言之就是用父类型别的指针指向其子类的实例，然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”，这是一种泛型技术。所谓泛型技术，说白了就是试图使用不变的代码来实现...]]></description><category></category></item><item><title><![CDATA[游戏服务端开发要点]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80038551</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80038551</guid><author>henrytien</author><pubDate>Sun, 22 Apr 2018 14:06:08 +0800</pubDate><description><![CDATA[ 游戏服务端开发要点]]></description><category></category></item><item><title><![CDATA[TCP建立连接为什么是三次握手，为什么不是两次或四次?]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80038494</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80038494</guid><author>henrytien</author><pubDate>Sun, 22 Apr 2018 14:00:45 +0800</pubDate><description><![CDATA[TCP建立连接为什么是三次握手，为什么不是两次或四次?




  第一次握手：客户端发送TCP包，置SYN标志位为1，将初始序号X，保存在包头的序列号(Seq)里。  
  第二次握手：服务端回应确认包，置SYN标志位为1，置ACK为X+1，将初始序列号Y，保存在包头的序列号里。  
  第三次握手：客户端对服务端的确认包进行确认，置SYN标志位为0，置ACK为Y+1，置序列号为Z。


为什么...]]></description><category></category></item><item><title><![CDATA[C++中Static作用和使用方法]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80036943</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80036943</guid><author>henrytien</author><pubDate>Sun, 22 Apr 2018 10:52:54 +0800</pubDate><description><![CDATA[C++中Static作用和使用方法

C++中Static作用和使用方法  
static作为编程语言里面一种重要的数据类型，它的地位在面试的过程里也是相当的高。

为什么要引入static?

　　函数内部定义的变量，在程序执行到它的定义处时，编译器为它在栈上分配空间，大家知道，函数在栈上分配的空间在此函数执行结束时会释放掉，这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时，如...]]></description><category></category></item><item><title><![CDATA[boost recursive_mutex(递归式互斥量)]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80027966</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80027966</guid><author>henrytien</author><pubDate>Sat, 21 Apr 2018 12:02:30 +0800</pubDate><description><![CDATA[谈谈recursive_mutex(递归式互斥量) 
如果一个线程中可能在执行中需要再次获得锁的情况,按常规的做法会出现死锁。  



boost::recursive_mutex g_rec_mutex;  
boost::recursive_mutex::scoped_lock lock(g_rec_mutex);  
        // 当然这种写法也可以  
        // bo...]]></description><category></category></item><item><title><![CDATA[boost coroutine2 协程]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80026499</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80026499</guid><author>henrytien</author><pubDate>Sat, 21 Apr 2018 09:43:39 +0800</pubDate><description><![CDATA[boost coroutine2



#include&amp;lt;cstdlib&amp;gt;
#include&amp;lt;iostream&amp;gt;
#include&amp;lt;boost/coroutine2/all.hpp&amp;gt;

int main()
{
    boost::coroutines2::coroutine&amp;lt;int&amp;gt;::pull_type source(
        [](b...]]></description><category></category></item><item><title><![CDATA[boost coroutine2 fibonacci.cpp]]></title><link>https://blog.youkuaiyun.com/henrytien/article/details/80026399</link><guid>https://blog.youkuaiyun.com/henrytien/article/details/80026399</guid><author>henrytien</author><pubDate>Sat, 21 Apr 2018 09:33:14 +0800</pubDate><description><![CDATA[boost coroutine2#include&amp;lt;cstdlib&amp;gt;
#include&amp;lt;iostream&amp;gt;
#include&amp;lt;boost/coroutine2/all.hpp&amp;gt;

int main()
{
    boost::coroutines2::coroutine&amp;lt;int&amp;gt;::pull_type source(
        [](boost...]]></description><category></category></item></channel></rss>