epoll模型的ET模式一般来说只触发一次,然而在并发程序中有特殊情况的存在,譬如当epoll_wait已经检测到socket描述符fd1,并通知应用程序处理fd1的数据,那么处理过程中该fd1又有新的数据可读,会唤醒其他线程对fd1进行操作,那么就出现了两个工作线程同时处理fd1的情况,这当然不是我们期望看到的。
那么下面我们就介绍epolloneshot事件,此规定操作系统最多触发其上注册的一个可读或者可写或者异常事件,且只触发一次,如此无论线程再多,只能有一个线程或进程处理同一个描述符。当然处理完之后线程要重置这个epolloneshot事件,进而当此描述符有事件可读时让其他进程可以处理此描述符。
下面就此epolloneshot事件编写一段测试代码:
客户端程序可以参见上篇博文的客户端程序(无序改动):http://blog.csdn.net/hnlyyk/article/details/50946194
服务端程序:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#