libevent库函数介绍
Libevent是一个高性能的事件通知库,他的特点是具有高性能,跨平台,支持高并发。它在内部封装了大量的IO多路复用的接口,因此很适合使用高并发的情况。
在网络编程中,首先会创建服务端的套接字,我们会调用listen()函数对套接字进行监听,当客户端和服务器之间相连,服务器端就会变得可读了,这时我们就会使用accept()函数接受客户端套接字。结合libevent库,我们可以这样理解,我们在libevent库中创建事件集,用来存放多个事件,每个事件中都可以设置需要监听的套接字和监听的事件(如读事件或者写事件),一旦被监听的套接字或者监听的事件发生时,就会执行回调函数。
Libevent不仅可以做到事件响应,还可以做到数据缓冲等,当我们写入数据时,会把数据写入到数据缓冲,libevent为此提供一种机制叫bufferevent,bufferevent是由三个部分组成的,一个传输端口,一个读取缓冲区,一个写入缓冲区,他可以在读取或者写入足够数据时回调用户的提供的函数。
Socket套接字
Socket套接字是两个主机之间进程的通信。
Tcp 服务端:
1、首先,需要拿到一个socket对象,socket 对象 与ip+port绑定,才能进行端口的监听;
2、然后,socket对象监听端口是否有请求,同时调用accept方法,一直阻塞等待客户端的链接;
3、如果,有客户端的请求发来,那么服务端接受到请求之后,调用read方法,读取数据;
4、之后再处理请求,写回数据使用write方法(在Python中是send方法)当需要断开链接时,服务端发送请求,客户端读取之后,在调用close方法发送断开的请求服务端read收到断开请求,服务端再调用close结束链接;
Tcp 客户端:
1、首先,需要拿到一个socket对象,调用connect方法,传入IP与端口,发送建立链接的请求;
2、之后,就可以进行数据交互,如果需要结束链接,直接调用close方法即可。
线程池
为什么使用线程池
1、可以降低系统的资源消耗,可以反复利用存在的线程,降低线程创建巨额销毁造成的消耗;
2、提高系统的响应速度,当有任务到达时,不需要等待新线程的创建就可以执行;
3、方便线程数量的控制,线程若是无限制的创建下去,则会造成大量资源消耗,线程池可以有效地管控线程;
线程池的执行流程
使用C++11中的bind/function定义和调用任务处理函数,
线程管理器:主要功能是创建和启动线程、调配任务、管理线程等。主要有三个方法:
start:创建一定数量线程池
stop:终止所有线程并回收资源
addTask:添加任务到消息队列
声明线程池大小、任务队列、互斥锁和条件变量、线程池是否开始
int m_threads_size;//线程池大小
std::vector<std::thread*> m_threads;//线程池
std::priority_queue<TaskPair,std::vector<TaskPair>,TaskPriorityCmp> m_tasks;//任务队列
std::mutex m_mutex;//STL队列不是线程安全的,因此需要结合互斥锁
std::condition_variable m_cond;//条件变量
bool m_started;//是否开始