epoll的总结 LT和ET使用EPOLLONESHOT

在前面说过,epoll有两种触发的方式即LT(水平触发)和ET(边缘触发)两种,在前者,只要存在着事件就会不断的触发,直到处理完成,而后者只触发一次相同事件或者说只在从非触发到触发两个状态转换的时候儿才触发。

这会出现下在一种情况,如果是多线程在处理,一个SOCKET事件到来,数据开始解析,这时候这个SOCKET又来了同样一个这样的事件,而你的数据解析尚未完成,那么程序会自动调度另外一个线程或者进程来处理新的事件,这造成一个很严重的问题,不同的线程或者进程在处理同一个SOCKET的事件,这会使程序的健壮性大降低而编程的复杂度大大增加。

解决这种现象有两种方法,一种是在单独的线程或进程里解析数据,也就是说,接收数据的线程接收到数据后立刻将数据转移至另外的线程。

第二种方法就是本文要提到的EPOLLONESHOT这种方法,可以在epoll上注册这个事件,注册这个事件后,如果在处理写成当前的SOCKET后不再重新注册相关事件,那么这个事件就不再响应了或者说触发了。这样就可以通过手动的方式来保证同一SOCKET只能被一个线程处理,不会跨越多个线程。

看下面的代码:

void Eepoll::ResetOneShot(int epollfd,SOCKET fd,bool bOne)

{

epoll_event event;

event.data.fd = fd;

event.events = EPOLLIN | EPOLLET ;

if (bOne)

{

event.events |= EPOLLONESHOT;

}

if (-1 == epoll_ctl(epollfd,EPOLL_CTL_MOD,fd,&event))

{

perror("resetoneshot epoll_ctl error!");

}

}

这里有一个问题,在操作ET模式下的EPOLL时,对EPOLLONESHOT没有什么太大的注意点,但是在LT时,就有一些注意的了。

前面说过LT会不断触发,所以在处理数据时,不需要在RECV时不断的循环去读一直读到EAGAIN,但如果设置了EPOLLONESHOT后,也得如此办理,否则,就可能会丢掉数据。

epoll的总结 LT和ET使用EPOLLONESHOT相关推荐

  1. Linux编程入门三网络编程三 epoll的LT和ET模式以及EPOLLONESHOT事件

    epoll对文件描述符的操作有两种模式:LT(Level Trigger 电平触发)模式和ET(Edge Trigger 边沿触发)模式. LT是默认的工作模式,这种模式下epoll相当于一个效率较高 ...

  2. epoll实现socket通信

    epoll是Linux特有的I/O复用函数,它在实现和使用上与select和poll有很大差异.epoll使用一组函数来完成任务,而不是单个函数.epoll把用户关心的文件描述符上的事件放在内核的一个 ...

  3. linux epoll用法

    epoll 是 linux 特有的 I/O 复用函数.它是把用户关心的文件描述符事件放在内核的一个事件列表中,故而,无须像select和poll一样每次调用都重复传入文件描述符或事件集.但是, epo ...

  4. linux下poll和epoll内核源代码剖析

    作者:董昊 博客链接http://donghao.org/uii/ poll和epoll的使用应该不用再多说了.当fd很多时,使用epoll比poll效率更高. 我们通过内核源码分析来看看到底是为什么 ...

  5. Linux的epoll

    在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll. 相比于select,epoll最大的好处在于它不会随着监听fd数目 ...

  6. IO复用之epoll系列

    epoll是什么? epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的 ...

  7. python下使用epoll

    因为最近想学习如何用epoll写服务器, 于是找到了一篇介绍的文章. 因为我最近一直看不进技术文章, 于是打算通过翻译来强迫自己学习. 原文在这里: http://scotdoyle.com/pyth ...

  8. 利用epoll写一个迷你的网络事件库

    epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...

  9. Learning by doing 系列文章(之一)如何在 Python 中使用 epoll ?

    epoll 简介 参见本博前一文<epoll使用详解> Epoll Within Python Python 在 2.6 版中引入了用于处理Linux epoll系统调用的API,本文简单 ...

最新文章

  1. c# 第六课 linq
  2. 在.NET中使用脚本引擎
  3. H264 数据avi文件封装和拆解
  4. 释放数据价值,大数据分析如何助力电商获客又增收?
  5. maya导入abc动画_三维文件格式知多少 | abc、glTF、fbx、obj、dae、stl、3ds...
  6. linux 标准输入句柄,标准文件描述符与标准文件句柄
  7. 【AtCoder - 4242 】To Infinity(思维)
  8. 一行命令导致的数据丢失,阿里工程师是如何恢复的?
  9. 面向内网无纸化会议/智慧教室/实时同屏,组播还是RTMP?
  10. MongoDB两阶段提交实现事务
  11. Lua 中写 C 扩展库时用到的一些技巧
  12. 11 种方法教你用 Python 高效下载资源
  13. xml里写sql语句大于、小于的正确方法
  14. 图片放大软件—ON1 Resize AI 2022兼容m1
  15. 骆驼壳修改服务器,【电视直播】发烧友TV,骆驼壳导入直播源教程,打造个人专属永久盒子软件,你们想看的这都有!...
  16. DoIP(一)——基础概念
  17. 计算机一级仿宋gb2312,2016年计算机一级Office考试题(带答案)
  18. win7与internet时间同步出错_Win7电脑时间同步出错怎么办?Win7电脑时间同步出错的解决方法...
  19. leetcode刷题笔记(1-10)持续更新中
  20. 批量下载bilibili视频

热门文章

  1. 记一次订单号的重复事故
  2. 抵御故障引发系统性失控的基本原则:混沌工程
  3. Spring Boot 2.1之后如何在启动日志中打印请求路径列表
  4. Java注解是如何工作的?
  5. 一个学渣三次面试阿里之路
  6. Spring Boot/Cloud干货汇总(持续更新:20180226版)
  7. sqlserver sql行专列_sqlserver----记录转载(行转列)、列转行、pivot、unpivot
  8. 判断一个数是不是2的指数幂
  9. mxnet 常用层,卷积激活损失
  10. mini-caffe