在主线程等待子线程的事件发生,可以使用pthread_cond_wait(),缺点是,如果主线程使用poll做多路复用,那么pthread_cond_wait()无法融合进去。
一种解决方案是创建一个匿名管道,然后子线程写数据,主线程读数据。这种方案确实可行。缺点是,唤醒多少次,就要收多少数据,另外就是半双工,涉及两个文件描述符。
eventfd就是为了解决上述问题出现的,而且eventfd是linux中出现的时间很早。
#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
使用上述接口创建一个eventfd的文件描述符。然后可以像正常的文件一样进行read/write/poll。eventfd内部维护一个64位的计数,根据flags的设定,read可以一次消耗所有的计数,或者消耗一个计数。