- 博客(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
linux下编程 ,关于信号sigaction中的sa_flags ,一些改变却不起作用
2014-11-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人