首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于eventfd,epoll,线程间通信小记

先介绍eventfd 1 #include 2 int eventfd(unsigned int initval, int flags); 使用这个函数来创建一个事件对象,...线程B:对eventfd进行Epoll监听,回调函数的功能是对eventfd的计数器读数据出来并将结果进行分发。 用例1:外部单个客户端每隔1秒向线程A发送一个请求。...用例1结果:线程A正确处理请求,并将结果写入eventfd中,线程B及时从eventfd中读取出请求处理结果,并正确分发给其他线程。 用例2:外部单个客户端连续向线程A发送多个请求。...用例2结果:线程A正确处理请求,并正确地将结果写入eventfd中,但在一定概率的情况下,线程B从eventfd中读到的结果不是线程A一次写入的结果,而是多次写入的结果。因此不能正确的分发请求。...线程B:对eventfd进行Epoll监听,回调函数的功能是对eventfd的计数器read数据出来然后判断,如果大于1就自减1然后从队列头部取出数据,并将结果进行分发 ,最后再写入新的计数器数据。

2.1K70
您找到你想要的搜索结果了吗?
是的
没有找到

让事件飞 ——Linux eventfd 原理与实践

简而言之,就是eventfd用来触发事件通知,timerfd用来触发将来的事件通知。 开发者使用eventfd相关的系统调用,需要包含头文件;对于timerfd,则是。...接口及参数介绍 eventfd 对于eventfd,只有一个系统调用接口 1int eventfd(unsigned int initval, int flags); 创建一个eventfd对象,或者说打开一个...eventfd的文件,类似普通文件的open操作。...本实例采用以下设计:生产者创建eventfd/timerfd并在事件循环中注册事件;消费者线程池中的线程共用一个epoll对象,每个消费者线程并行地进行针对eventfd或timerfd触发的事件循环的轮询...内核实现细节 eventfd在内核源码中,作为syscall实现在内核源码的 fs/eventfd.c下。从Linux 2.6.22版本引入内核,在2.6.27版本以后加入对flag的支持。

4.5K31

从内核看eventfd的实现(基于5.9.9)

前言:eventfd是一种进程/线程通信的机制,他类似信号,不过eventfd只是一种通知机制,无法承载数据(eventfd承载的数据是8个字节),他的好处是简单并且只消耗一个fd。...1 创建eventfd SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags){ return do_eventfd(count,...flags);} SYSCALL_DEFINE1(eventfd, unsigned int, count){ return do_eventfd(count, 0);} 内核支持两个版本的eventfd...(ctx); return fd;} do_eventfd主要是创建了一个eventfd_ctx结构体并初始化。...后记:我们看到eventfd的实现相对是比较简单的,多个进程/线程通过fd指向同一个file,然后file关联一个eventfd_ctx。多个进程/线程通过这个共同的eventfd_ctx实现通信。

68650

Looper的wake机制升级

前言 我做了两期有关Looper的视频,目前来看播放量还不错,有兴趣的可以去B站观看,视频中我提到Looper采用pipe机制wake,纠正一下自己的错误,新版本的Looper已经采用eventfd代替...(0, EFD_NONBLOCK);//用eventfd初始化mWakeEventFd AutoMutex _l(mLock); rebuildEpollLocked(); } void...eventfd代替pipe 3.1 fd减少一个 每个进程fd是有上限的,一般是1024个,超出了就是OOM pipe产生2个fd eventfd只会产生1个fd 3.2 轻量化 虽然wake的时候都是往...fd写入一个字符或者数字,但是内核中pipe和eventfd对write的系统调用的实现可不同,可以观看我的视频,了解详情。...王小二图解Android【005】一切皆文件 pipe需要维护一个内存缓冲区,一般是4096B eventfd只需要维护一个无符号的64位整形计数器 counte 四、总结 很明显eventfd用更少的代价达到了相同的目的

1.2K20

聊聊BIO,NIO和AIO (2)磁盘IO磁盘IO的优化AIO反思AIO

并且aio_suspend并不支持eventfd(下文会讲到为什么eventfd很重要)。...eventfd可以帮助把两个阻塞点二合为一。eventfd,顾名思义,就是表达事件的fd。...它的本意是利用fd来简化跨进程的通讯——比如AB两个进程共享同一个eventfd,A进程对eventfd写入,B进程就能感知到。当然,eventfd也能在同一个进程里用。...eventfd能协调epoll和Linux AIO是因为: epoll支持监听eventfd,并且 Linux AIO中被提交的events如果完成,就会触发eventfd,于是监听该eventfd的epoll...然后epoll_wait监听这个eventfd。在现实中,epoll可以同时监听此eventfd和所有其他socket的fd。一旦IO完成,eventfd被触发,epoll_wait返回。

3.9K90

Android Looper,Handler,Message,MessageQueue介绍

;;) { Message msg = queue.next(); // might block // 阻塞式等待,最终是会阻塞到epoll_wait上等待消息,这块是通过读写eventfd...(0, EFD_NONBLOCK | EFD_CLOEXEC)); //创建eventfd LOG_ALWAYS_FATAL_IF(mWakeEventFd.get() < 0, "Could...的使用,之前android使用的是pipe,后来换成了eventfd,这儿使用eventfd相对于pipe有以下几个好处: 对于进程间通信,如果使用pipe,就需要每个进程创建2个fd,如果是n个进程,...而使用eventfd就只需要一个fd就可以了 使用pipe效率没有eventfd高,eventfd就是一个计数器,内容就是一个32字节的整数,传输开销可以忽略不计,而pipe则需要内存至少分配一个4k内存..., this, eventCount); #endif for (int i = 0; i < eventCount; i++) { //对于Fwk的Looper,其实一般只有一个fd,就是eventfd

78520
领券