自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 资源 (2)
  • 问答 (1)
  • 收藏
  • 关注

原创 libevent源码分析之关于notify

之前学习过程中遇到过要notify主线程的情况, 不过并未理会选择直接跳过, 现在拿来细讲.其实简单的说, notify就是告知主线程你的内部发生了变化,现在最好停止等待, 重新调用IO复用函数比如在event_add ---> event_add_internal中static inline intevent_add_internal(struct event *ev, c

2015-06-29 21:02:41 715

原创 libevent源码分析之带有定时器的事件

关于超时event, 一开始接触libevent时遇到的example就是它, 小巧而简单易懂, 但是其内部却因为种种因素而十分庞杂.一个单纯的定时器event如下定义:#define evtimer_new(b, cb, arg)        event_new((b), -1, 0, (cb), (arg))其实, 如果需要一个event拥有定时器的功能, 都只需要在event_

2015-06-29 16:49:10 3404

原创 libevent源码分析之多线程准备工作

libevent中是默认不开启多线程的,也就没有什么锁, 条件变量等的说法了我们可以使用evthread_use_pthreads()开启linux下的pthread#ifdef WIN32int evthread_use_windows_threads(void);#define EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED#endif#i

2015-06-25 15:32:50 1019

原创 libevent源代码分析之优先级

在学习基础API的时候,遇到过两个函数:int event_base_priority_init(struct event_base *base, int n_priorities); 以及int event_priority_set(struct event *event, int priority);阅读相关文档后得知, 第一个函数用于设置整个event_base的最大优

2015-06-24 09:16:57 592

原创 libevent源码分析之深入信号处理

信号关于统一事件源, 本文是在对其有所了解的情况下进行的,旨在加深对libevent的整体理解首先,想要了解信号事件的处理,我们需要知道关于信号这部分的接口、内容分别在哪里纵观整个文件夹, 可以看到evsignal-internal.h, signal.c, signal-test.c 这几个文档, 接口在哪里呢?回忆之前所学内容, 首先肯定是找event_base , 在添加

2015-06-23 16:41:18 591

原创 libevent源码分析之关于IO复用的选取

关于libevent使用的后台IO复用技术, 无非就是那几种,这里我们将会看到的是libevent是如何选取某平台上最合适的IO复用的, 以及对IO复用的包装的例子想要了解后台IO复用的选取, 首先需要知道的是在哪里声明了IO复用的接口, 既然IO复用是要贯穿整个网络库的, 那么说明我们需要从event_base里找:struct event_base { /** Func

2015-06-21 10:54:48 766

原创 关于select函数使用的fd_set

最近遇到了fd_set, 虽然早早的听说是将描述符按位存储, 但不清楚其实现, 今天就来仔细的看看其实现/* The fd_set member is required to be an array of longs. *///从注释可以看出的是, fd_set本质是一串long int类型的数组typedef long int __fd_mask;/* Some vers

2015-06-21 10:16:12 923

原创 libevent源码分析之event_io_map与event_signal_map

现在,我们来看看libevent中使用的哈希表在学习此数据结构之前,要知道一个事实,什么时候会使用到这个哈希表:/* On some platforms, fds start at 0 and increment by 1 as they are   allocated, and old numbers get used.  For these platforms, we

2015-06-16 18:25:28 1286

原创 STL源码分析之__type_traits

之前我们对iterator_traits有了一些了解,现在我们要了解__type_traits。Iterator_traits负责萃取迭代器的特性,__type_traits则负责萃取型别的特性。 对于型别的特性,我们关注的点可能在于对该型别是否需要复杂处理。如果答案是否定的,我们在对这些型别进行构造、析构、拷贝赋值等操作时,就可以采取最有效率的措施,比如不使用析构函数,直接free等

2015-06-15 15:06:17 1493

原创 STL源码分析之copy算法

Copy ----- 深入强化效率 首先,先看看assignment operator(即 operator =) 和拷贝构造函数的区别第一,  他们是不可能被同时调用的其次,不管什么构造函数,它只可能在需要构造一个对象的时候被调用,比如:String s = s1;String s(s1);这里调用的是拷贝构造函数,是构造新对象用的而重载的operator=,完全可

2015-06-15 14:59:45 602

原创 STL源码分析之literator和triats编程技法

Traits编程技法:1、 关于模板的参数推导此例中以func为对外接口,却把实际操作全部放在func_impl中,由于func_impl是一个function template,一旦被调用,编译器会自动进行template参数推导,于是导出型别T,顺利解决问题          迭代器所指对象的型别,称为该迭代器的 value type .上述的参数型别推导虽可用,但不是全面

2015-06-14 21:28:24 942

原创 libevent源码之TAILQ详解

首先,让我们看看插入操作的源代码:#define TAILQ_INSERT_TAIL(head, elm, field) do {            \    (elm)->field.tqe_next = NULL;                    \    (elm)->field.tqe_prev = (head)->tqh_last;            \

2015-06-14 17:43:51 2452 3

原创 STL源码分析之 sort算法

关于rotate算法         目的是将[first,middle)和[middle, last)间的元素互换,middle所指的元素会成为容器的第一个元素         比如{1, 2, 3,4, 5, 6}, 对元素3做rotate旋转操作,结果为{3, 4, 5, 6, 1, 2,}  首先要看一下关于reserve的算法:template void _

2015-06-13 14:46:51 517

转载 为什么要在宏中使用 do{...}while(0) (转)

如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子:#define __set_task_state(tsk, state_value) \ do{ (tsk)->st

2015-06-10 20:25:14 906

原创 大话设计模式之建造者模式

将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。比如同一种圆,可以有不同的半径(细节)建造者模式又叫‘生成器模式’如果我们使用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到它们,而具体的建造过程和细节就不需要知道了 //抽象的建造人的类abstractclass PersonBuilder{ public abstract

2015-06-10 15:43:16 444

原创 服务器框架初识

这张图既能用来描述一台服务器,也能用来描述一个服务器机群:    模块                 单个服务器程序                      服务器机群   I/O处理单元        处理客户连接,读写网络数据    作为接入服务器,实现负载均衡    逻辑单元            业务进程或线程                      

2015-06-07 23:28:12 559

原创 STL源码分析之power算法

关于算法power一般我们遇到要实现power算法,最直接就是如下实现: Int power(int x, unsigned int n){ Intresult = 1;While(n--) result *= x;return result;}然而,这样计算的复杂度为O(n) 想要改进,因为 x^n = x^(n/2)

2015-06-07 15:32:21 1494

原创 STL源码分析之泛型算法由来

什么事质变算法:是指在运算过程中会更改区间内(迭代器所指)的元素内容         例如copy, swap,replace, fill, remove, sort等等 什么是非质变算法:         例如find,search, count, max, min等等 算法的泛化过程         关于数组,当我们在其内寻找某个元素时,找到即返回;如果没有找到

2015-06-07 15:26:52 411

原创 STL源码分析之hashtable

二叉搜索树具有对数平均时间的表现,但这样的表现构造在一个假设上:输入数据有足够的随机性这里我们要介绍的是散列表数据结构,这种结构在插入、删除、搜寻等操作上具有“常数平均时间”的表现,而且这种表现是以统计为基础,不需要仰赖输入元素的随机性 Hash table提供对任何有名项的存取操作和删除操作。由于操作对象是有名项,所有hashtable可被视为一种字典结构。 hashtabl

2015-06-07 15:15:13 614

原创 STL源码分析之RB-tree结构简析

所谓关联容器:         每笔数据(每个元素)都有一个键值(key)和一个实值(value)。当元素被插入到关联式容器中时,容器内部结构(可能是RB-Tree 也可能是hash-table)便依照其键值大小,以某种特定规则将这个元素置放于适当的位置。         关联容器没有所谓的头尾(只有最大元素和最小元素),所以不会有所谓的push_back(), push_front(),

2015-06-07 14:58:54 683

原创 STL源码分析之大顶堆

关于大顶堆和小顶堆这里就不再介绍了,这里通过STL再次回顾一下。heap为了适应容器大小的不断变化,底层调用vector实现关于heap的算法(这里是大顶堆) push_heap()算法为了满足完全二叉树的条件,新加入的元素一定是放在最下一层作为叶节点,并填补在由左至右的第一个空格,即插在vector的end()处  我们通过上溯,将新节点与其父节点

2015-06-07 14:56:42 958

原创 tcp/ip ---------- 网际协议之tcp

可靠交付服务的特征:1、 面向数据流2、 虚电路连接(打电话类似)3、 有缓冲的传输4、 无结构的数据流5、 全双工连接  提供可靠性         即要求接收方收到数据之后向源站回送确认ACK报文         发送发对发出的每个分组都保存一份记录,在发送下一个分组之前等待确认信息         发送方还在发出分组时启动一个定时器,并在定时器超时

2015-06-01 20:52:04 670

原创 libevent使用(二) ----- event_base 和 event

如果设置event_base使用锁,则可以安全的在多线程这使用它。然而,其事件循环则只能运行在一个线程中,如果需要用多个线程检测IO,则需要为每个线程使用一个event_base。建立默认的event_basestruct event_base *event_base_new(void)//函数分配并返回一个新的具有默认设置的event_base。函数会检测环境变量

2015-06-01 17:33:50 966

小型自动关机软件

可以用来自动关机 很方便 这个东西我最近一直在用 源代码公开

2013-09-19

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

TA关注的人

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