网络编程之线程池通信

epoll函数可以实现多台主机和本地连接。在网络中还存在一个select()函数,但是epoll函数和它相比,存在一些优点:

1、epoll返回时已经明确的知道哪个sokcet fd发生了事件,不用再一个个比对。这样就提高了效率

2、select的FD_SETSIZE是有限止的,而epoll是没有限止的只与系统资源有关。

 

基本函数:

1、函数声明:int epoll_create(int size)
     该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket fd数。随你定好了。只要你有空间。

 

2、函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
    该函数用于控制某个epoll文件描述符上的事件,可以注册事件,修改事件,删除事件。
    参数分析:
    epfd:由 epoll_create 生成的epoll专用的文件描述符;
    op:要进行的操作例如注册事件,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 删除

    fd:关联的文件描述符;
    event:指向epoll_event的指针;
    如果调用成功返回0,不成功返回-1 。

    结构体内容介绍:

    typedef union epoll_data
   {
         void *ptr;
         int fd;
         __uint32_t u32;
         __uint64_t u64;
   } epoll_data_t;

  struct epoll_event

  {
       __uint32_t events;   /* Epoll events */
       epoll_data_t data;   /* User data variable */
   };

   使用介绍:

   struct epoll_event ev;
   //设置与要处理的事件相关的文件描述符
    ev.data.fd=listenfd;
   //设置要处理的事件类型
   ev.events=EPOLLIN|EPOLLET;
   //注册epoll事件
   epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);

 

    常用的事件类型:
     EPOLLIN :表示对应的文件描述符可以读;
     EPOLLOUT:表示对应的文件描述符可以写;
     EPOLLPRI:表示对应的文件描述符有紧急的数据可读
     EPOLLERR:表示对应的文件描述符发生错误;
     EPOLLHUP:表示对应的文件描述符被挂断;
     EPOLLET:表示对应的文件描述符有事件发生;

3、函数声明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
     该函数用于轮询I/O事件的发生;

     epoll_wait运行的原理:
     等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中。
     并且将注册在epfd上的socket fd的事件类型给清空,所以如果下一个循环你还要关注这个socket fd的话,则需要用epoll_ctl(epfd,EPOLL_CTL_MOD,listenfd,&ev)来重新设置。

 

二、线程池的使用

线程池,其实就是开辟多个线程,首先让所有的线程处于阻塞状态,当达到一些条件下,释放一些阻塞的线程,来实现一些特定的功能。可以利用epoll函数来触发线程池中的线程来实现特定的功能。下面是我的示例代码中的实现图。

 

代码已经上传

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值