libevent+socket+线程池

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;//是否开始
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值