- 博客(83)
- 资源 (118)
- 收藏
- 关注
原创 C++11多线程
线程例子程序需要从main函数开始,同样线程也是从某个函数开始的(这个函数下文称为线程函数)。和pthread_create一样,C++11提供的线程类std::thread,在创建类变量的时候就产生一个线程,因此需要在std::thread的构造函数中传入线程函数作为参数。得益于C++11支持可变参数模板和完美转发,如果线程函数拥有参数,那么可以十分自然地通过std::thread的构造函数传递。
2017-04-08 12:52:56
8293
1
原创 用AVCodecParameters代替AVCodecContext
AVCodecParameters使用在高版本的ffmpeg库中使用AVStream::codec成员时,编译和运行时都出现一堆警告:
2017-02-16 00:12:19
20836
1
原创 C++11时间详解
转载请注明出处: C++ 11增加了三个与时间相关的类型:时间段、时钟、时间点。以史为鉴 现有的系统API中,时间太过于碎片化了。有time_t(秒)、struct timeval(微秒)、struct timespec(纳秒)这几个时间单位,他们的接口非常不统一,点击这里可以体会一下。主要原因:是由于新业务的需求,要求提供不同精度的时间。于是每次出现新需求就定
2015-07-14 00:08:50
26077
4
原创 C++ 11 右值引用以及std::move
新类型: int和int&是什么?都是类型。int是整数类型,int&则是整数引用类型。同样int&&也是一个类型。两个引号&&是C++ 11提出的一个新的引用类型。记住,这是一个新的类型。默念10次吧。如果你记住这个新类型,那么很多疑问都能迎刃而解。并且对《Effective Modern C++》说到的void f(Widget&& w),就很容易明白w是新类型的一
2015-07-07 00:05:38
11647
6
原创 DNS查询流程简介
转载请注明出处: DNS(domain name system),读者们或多或少都听过,就是可以将域名转换给IP的一个系统。使得我们只需记住域名而非IP就能访问某个网站。当我们在浏览器里面输入一个网址时,浏览器会向本地DNS服务器发出查询请求,本地DNS服务器会把网址对应的IP返回给浏览器。注意:更确切来说,不是本地DNS服务器,而是Windows网络连接里面所配
2015-05-07 00:32:36
13253
原创 memcached源码分析-----set命令处理流程
转载请注明出处: 前一篇博文以get命令为例子把整个处理流程简单讲述了一遍,本篇博文将以set命令详细讲述memcached的处理流程。具体的命令为“set tt 3 0 10”,并假设当然memcached服务器没有名为tt的item。读取命令: 在前一篇博文的最后,conn的状态被设置为conn_new_cmd,回
2015-03-13 09:28:44
3902
原创 memcached源码分析-----get命令处理流程
转载请注明出处: 本文以get命令为例子,探讨memcached是如何处理命令的。本文只是探讨memcached处理命令的工作流程,具体的代码细节在不影响阅读的前提下能省略的就省略、能取默认值就取默认值、内存是足够的(不需要动态申请空间就够用了)。涉及到数组、缓存区的就假设已经分配好了。 现在假定memcached里面有了一个键值
2015-03-12 09:44:10
3621
原创 memcached源码分析-----slab automove和slab rebalance
转载请注明出处:需求: 考虑这样的一个情景:在一开始,由于业务原因向memcached存储大量长度为1KB的数据,也就是说memcached服务器进程里面有很多大小为1KB的item。现在由于业务调整需要存储大量10KB的数据,并且很少使用1KB的那些数据了。由于数据越来越多,内存开始吃紧。大小为10KB的那些item频繁访问,并且由于内存不够
2015-01-22 09:56:35
4405
原创 memcached源码分析-----item过期失效处理以及LRU爬虫
转载请注明出处: 温馨提示:本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量,处理方式就像《如何阅读memcached源代码》所说的那样直接取其默认值。过期失效处理: 一个item在两种情况下会过期失效:1.item的exptime
2015-01-21 09:46:41
5799
原创 memcached源码分析-----item锁级别与item引用计数
转载请注明出处:锁级别: 从前面的《扩展哈希表》知道:哈希表进行扩展时,有一个专门的线程负责将item数据从旧哈希表迁移到新哈希表(由此,也称这个线程为迁移线程)。此外,还有一些worker线程会时不时访问item(包括插入、删除和获取)。这些线程的对item所做的操作基本上都是互斥的,必须加锁控制。 如果只使用一个锁,抢到该锁才能使
2015-01-20 09:52:41
3454
原创 memcached源码分析-----LRU队列与item结构体
转载请注明出处:LRU队列: 之前的《slab内存分配》博文已经说到一个slab class里面的所有slab分配器都只分配相同大小的item,不同的slab class分配不同大小的item。item结构体里面有一个slabs_clsid成员,用来指明自己是属于哪个slab class的。这里把slabs_clsid值相同的item称为是同一类ite
2015-01-19 09:46:49
6140
原创 memcached源码分析-----哈希表基本操作以及扩容过程
转载请注明出处: 温馨提示:本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量,处理方式就像《如何阅读memcached源代码》所说的那样直接取其默认值。 assoc.c文件里面的代码是构造一个哈希表。memcached快的一个原因是使用了哈希表。现在就
2015-01-16 10:14:25
7663
1
原创 memcached源码分析-----slab内存分配器
转载请注明出处: 温馨提示:本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量,处理方式就像《如何阅读memcached源代码》所说的那样直接取其默认值。slab内存池分配器:slab简介: memcached使用了一个叫slab的内
2015-01-15 10:16:57
7144
原创 memcached源码分析-----网络模型
转载请注明出处:半同步/半异步: memcached使用半同步/半异步网络模型处理客户端的连接和通信。 半同步/半异步模型的基础设施:主线程创建多个子线程(这些子线程也称为worker线程),每一个线程都维持自己的事件循环,即每个线程都有自己的epoll,并且都会调用epoll_wait函数进入事件监听状态。每一个worker线程(子线程)和
2015-01-14 09:59:20
7215
原创 memcached源码分析-----memcached启动参数详解以及关键配置的默认值
本文将给出memcached启动时各个参数的详细解释以及一些关键配置的默认值。以便在分析memcached源码的时候好随时查看。当然也方便使用memcached时可以随时查看各个参数的含义。《如何阅读memcached源码》说到memcached有很多全局变量(也就是关键配置),这些全局变量会给
2015-01-13 10:37:00
8191
原创 memcached源码分析-----安装、调试以及如何阅读memcached源码
转载请注明出处:安装: 安装memcached之前要先安装Libevent。现在假定Libevent安装在/usr/local/libevent目录了。 因为memcached安装后不像Libevent那样,有一堆头文件和库文件。安装后的memcached不是用来编程而直接用来运行的。所以不需要在/usr/local目录下专门为memcach
2015-01-12 10:39:42
5596
原创 有限域GF(2^8)的四则运算及拉格朗日插值
域的性质: 群和域在数学上的概念就不解释,可以参考维基百科。当然也可以参考《密码编码学与网络安全》这书的有限域一章。形象地说,域有这样一个性质:在加法和乘法上具有封闭性。也就是说对域中的元素进行加法或乘法运算后的结果仍然是域中的元素。有一点要注意,域里面的乘法和加法不一定是我们平常使用的乘法和加法。可以把C语言中的与运算和异或运算分别定义成加法和乘法。但习惯上,仍然使用符号+
2014-12-01 12:26:01
57224
27
原创 libevent编程疑难解答
前段时间阅读了libevent的源码。读完后,之前在使用libevent时的一些疑问都已经豁然开朗了。对于libevent源码的分析,可以到http://blog.youkuaiyun.com/luotuo44/article/category/2435521查看。本文通过自问自答的形式,希望能帮助其他人解答在使用libevent时的一些疑惑。
2014-09-25 10:46:53
18614
7
原创 Qt跨线程发送信号与元数据
Qt的signals/slots是可以用在线程间的。由于事件循环(event loop)是在主线程完成的,所以在非主线程发送一个信号时,对应的槽函数将会由主线程执行。熟悉多线程的读者应该都感受到这里会有一个微妙的问题。如果signals/slots的函数参数是一个自己定义的类型。比如自己定义了一个Student类,信号函数为sendStudent(const Student &stu)
2014-09-19 10:46:48
15682
3
原创 Linux时间类型、函数和休眠函数
本文主要涉及Linux时间类型、时间函数以及Linux提供的睡眠函数。 时间类型和对应的函数:time_t: 最不陌生的时间类型恐怕是time_t这个类型了吧。它出现在C语言的标准库。但ISO C中并没有规定time_t是什么类型、范围以及精度,不过在POSIX中一般是被实现为有符号的整型。 time_t的单位是秒。函数time()的返回值就是一个time
2014-09-18 16:51:29
13931
1
原创 Libevent源码分析-----bufferevent工作流程探究
和之前的《Libevent工作流程探究》一样,这里也是用一个例子来探究bufferevent的工作流程。具体的例子可以参考《Libevent客户端例子》,这里就不列出了。其实要做的例子也就是bufferevent_socket_new、bufferevent_setcb、bufferevent_enable这几个函数。因为本文会用到《Libevent工作流程探究》中提到的说法,比如将一个eve
2014-09-17 17:06:41
16934
5
原创 Libevent源码分析-----更多evbuffer操作函数
锁操作:在前一篇博文可以看到很多函数在操作前都需要对这个evbuffer进行加锁。同event_base不同,如果evbuffer支持锁的话,要显式地调用函数evbuffer_enable_locking。
2014-09-16 23:22:56
7192
原创 Libevent源码分析-----evbuffer结构与基本操作
对于非阻塞IO的网络库来说,buffer几乎是必须的。Libevent在1.0版本之前就提供了buffer功能。现在来看一下Libevent的buffer。buffer相关结构体:
2014-09-15 12:06:00
9770
12
原创 Libevent源码分析-----连接监听器evconnlistener
基于event和event_base已经可以写一个CS模型了。但是对于服务器端来说,仍然需要用户自行调用socket、bind、listen、accept等步骤。这个过程有点繁琐,为此在2.0.2-alpha版本的Libevent推出了一些对应的封装函数。用户只需初始化struct sockaddr_in结构体变量,然后把它作为参数传给函数evconnlistener_new_bind即可。该
2014-08-24 22:16:04
11792
2
原创 Libevent源码分析-----通用类型和函数
Libevent定义了一系列的可移植的兼容类型和函数。这使得在各个系统上都有一致的效果,Libevent一般都会在兼容通用类型和函数的前面加上ev或evutil前缀。 在实现上,Libevent都是使用条件编译+宏定义的方式。使用这种方式,同一个宏名字,可以使得在不同的系统上, 编译时得到不同的值。这种方式在跨平台编程中,经常使用到。此外,对于Libevent的兼容类型,如果所在系
2014-08-23 18:16:45
7595
原创 Libevent源码分析-----与event相关的一些函数和操作
Libevent提供了一些与event相关的操作函数。本文就重点讲一下这方面的源代码。 在Libevent中,无论是event还是event_base,都是使用指针而不会使用变量。实际上,如果查看Libevent不同的版本,就可以发现event和event_base这两个结构体的成员是不同的。对比libevent-2.0.21-stable和libevent-1.4.13-stable这两
2014-08-21 22:49:28
5482
原创 Libevent源码分析-----管理超时event
前面的博文已经说到,如果要对多个超时event同时进行监听,就要对这些超时event进行集中管理,能够方便地(时间复杂度小)获取、加入、删除一个event。在之前的Libevent版本,Libevent使用小根堆管理这些超时event。小根堆的插入和删除时间复杂度都是O(logN)。在2.0.4-alpha版本时,Libevent引入了一个叫common-timeout的东西来管理超时even
2014-08-19 11:05:54
6332
原创 Libevent源码分析-----Libevent时间管理
Libevent采用的时间类型是struct timeval,这个类型在很多平台都提供了。此外,Libevent还提供了一系列的时间操作函数。比如两个struct timeval相加、相减、比较大小。有些平台直接提供了一些时间操作函数,但有些则没有,那么Libevent就自己实现。这些宏如下:
2014-08-18 15:57:50
8671
1
原创 Libevent源码分析-----evthread_notify_base通知主线程
一般来说,是主线程执行event_base_dispatch函数。本文也是如此,如无特别说明,event_base_dispatch函数是由主线程执行的。本文要说明的问题是,当主线程在执行event_base_dispatch进入多路IO复用函数时,会处于休眠状态,休眠前解锁。此时,其他线程可能想往event_base添加一个event,这个event可能是一般的IO event也可能是超时e
2014-08-14 21:02:44
10473
1
原创 Libevent源码分析-----信号event的处理
前面讲解了Libevent怎么对一个IO事件进行监听,现在来讲一下Libevent怎么监听信号。Libevent对于信号的处理是采用统一事件源的方式。简单地说,就是把信号也转换成IO事件,集成到Libevent中。
2014-08-13 16:55:42
9053
2
原创 Libevent源码分析-----event优先级设置
event_base允许用户对它里面的event设置优先级,这样可以使得有些更重要的event能够得到优先处理。可以通过event_base_priority_init函数设置event_base的优先级个数,该函数实现如下://event.c文件 intevent_base_priority_init(struct event_base *base, int npriorities){
2014-08-12 11:24:48
5203
1
原创 Libevent源码分析-----Libevent工作流程探究
之前的博文讲了很多Libevent的基础构件,现在以一个实际例子来初步探究Libevent的基本工作流程。由于还有很多Libevent的细节并没有讲所以,这里的探究还是比较简洁,例子也相当简单。
2014-08-11 22:32:19
13274
4
原创 Libevent源码分析-----跨平台Reactor接口的实现
之前的博文讲了怎么实现线程、锁、内存分配、日志等功能的跨平台。Libevent最重要的跨平台功能还是实现了多路IO接口的跨平台(即Reactor模式)。这使得用户可以在不同的平台使用统一的接口。Libevent会根据所在的系统选择一个合适的多路IO复用函数。这篇博文就是来讲解Libevent是怎么实现这一点的。 Libevent在实现线程、内存分配、日志时,都是使用了函数指针和全
2014-08-09 17:40:38
7412
4
原创 Libevent源码分析-----配置event_base
前面的博文都是讲一些Libevent的一些辅助结构,现在来讲一下关键结构event_base。 这里作一个提醒,在阅读Libevent源码时,会经常看到backend这个单词。其直译是“后端”。实际上其指的是Libevent内部使用的多路IO复用函数。本系列博文中,我不会使用到“后端”这个词,而采用“多路IO复用函数”。多路IO复用函数就是select、poll、epoll
2014-08-08 20:15:16
10207
1
原创 Libevent源码分析-----event_signal_map
因为event_signal_map结构体实在太简单了,所以不像event_io_map那样,有一个专门的文件。由于没有专门的文件,那么只能从蛛丝马迹上探索这个event_signal_map结构了。通过一些搜索,可以得到与event_signal_map相关联的一些结构体有下面这些:
2014-08-07 19:58:43
4891
2
原创 Libevent源码分析-----event_io_map哈希表
上一篇博客说到了TAILQ_QUEUE队列,它可以把多个event结构体连在一起。是一种归类方式。本文也将讲解一种将event归类、连在一起的结构:哈希结构。哈希结构由下面几个结构体一起配合工作:
2014-08-06 16:47:53
7092
原创 Libevent源码分析-----TAILQ_QUEUE队列
Libevent源码中有一个queue.h文件,位于compat/sys目录下。该文件里面定义了5个数据结构,其中TAILQ_QUEUE是使得最广泛的。本文就说一下这个数据结构。TAILQ_QUEUE由下面两个结构体一起配合工作。
2014-08-04 19:47:42
11484
7
原创 Libevent源码分析-----多线程、锁、条件变量(二)
Libevent还支持对锁操作的一些检测,进而捕抓一些典型的锁错误。Libevent检查:1. 解锁自己(线程)没有持有的锁 2. 在未解锁前,自己(线程)再次锁定一个非递归锁。 Libevent通过一些变量记录锁的使用情况,当检查到这些锁的错误使用时,就调用abort,退出运行。用户只需在调用evthread_use_pthreads或者evthread_use_window
2014-08-03 20:21:38
7060
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人