1.新内核版本为什么要增加eventfd?
首先说明的一点是eventfd是用来实现多进程或多线程的之间的事件通知的,那么我们在没接触eventfd之前用到的事件通知机制都有那些?
1.条件变量
2.管道
我们来逐一比较此俩中机制与eventfd的效果方面的好坏,首先,条件变量必须和互斥锁结合使用,使用起来麻烦,而且性能未必比eventfd好,其次条件变量不能像eventfd一样为I/O事件驱动,因此不能和服务器的I/O模式很好的融合,所以在某些时候不如eventfd好用
接着是管道,虽然管道能与I/O复用很好的融合,但很明显管道相比eventfd多用了一个文件描述符,而且管道的话内核还得给其管理的缓冲区,eventfd则不需要,所以单纯作为事件通知的话还是管道好用
2.event的主要接口
eventfd只有一个接口,形式如下
int eventfd(unsigned int initval, int flags);
//成功返回事件驱动的文件描述符
eventfd()创建一个文件描述符,这个文件描述符用户可以通过等待其可读来实现事件通知,该通知靠内核来响应用户空间的应用事件。上述接口的第一个参数是一个由内核来保持的64位计数器,这个计数器有参数initval来初始化,关于此计数器的影响我在下文中的具体实例中给大家演示,一般我们可将其设为0
第二个参数flags可以为EFD_NONBLOCK或EFD_CLOEXEC,其

本文探讨了Linux新内核版本引入eventfd的原因,对比了它与条件变量和管道在事件通知机制上的优劣。eventfd提供了一种简单高效的方式进行多线程间的事件通信,其主要接口为eventfd(),并介绍了相关参数的用法。通过具体实例展示了如何使用eventfd进行线程间的事件通知,并分析了initval参数对计数器的影响。
最低0.47元/天 解锁文章
1927

被折叠的 条评论
为什么被折叠?



