用 eventfd 在线程之间通信
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
最近有想法把网络库推广成能在线程,同主机进程和不同主机之间的通信的公共中间件。后面两样都可以用 socket。 当然同主机进程也可以用别的,先不想那么多。我要说的线程之间,要实现和 socket 统一的 reactor 通信机制,比较好的是用 Linux 的 eventfd 。
eventfd 是一个相对比较新的东西,资料不多,所以我也是摸着石头过河。基本做法就是用 eventfd_create 创建好文件描述符,随后喂给 epoll_wait。两个线程如果要实现,比如生产者-消费者,就一个读,一个写。
感谢 Unix 的“一切都是文件”思想,把这个机制融合到网络库中没有太大困难。我的测试程序起一个 Reader 线程和一个 Writer 线程,双方各有一个 epoll 循环,通过一个 eventfd 来传递数据,彼此无需上锁就可以实现同步。
如果是要做一些很简单的事,这样当然反而麻烦了。但是最大好处是:这种机制在线程间,进程间和主机间都一致,所以是有可能让代码(至少是业务代码)无需修改就能任意伸缩的。这也是中间件的好处。
刚才测试了一下线程之间用这种办法通信的性能,个人还比较满意,我测的部分是
1. Writer 往 eventfd 写一个数,然后等着
2. Reader 线程接到 epoll 的通知,醒过来把事件发到事件处理者
3. 事件处理者从 eventfd 把数据读出来
整个过程涉及数个系统调用,以及线程切换,测试表明平均大约花费30微秒,这已经非常不错了。
GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:4 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献1条内容
所有评论(0)