用 eventfd 在线程之间通信

1 篇文章 0 订阅
1 篇文章 0 订阅

最近有想法把网络库推广成能在线程,同主机进程和不同主机之间的通信的公共中间件。后面两样都可以用 socket。 当然同主机进程也可以用别的,先不想那么多。我要说的线程之间,要实现和 socket 统一的 reactor 通信机制,比较好的是用 Linux 的 eventfd 。

eventfd 是一个相对比较新的东西,资料不多,所以我也是摸着石头过河。基本做法就是用 eventfd_create 创建好文件描述符,随后喂给 epoll_wait。两个线程如果要实现,比如生产者-消费者,就一个读,一个写。

感谢 Unix 的“一切都是文件”思想,把这个机制融合到网络库中没有太大困难。我的测试程序起一个 Reader 线程和一个 Writer 线程,双方各有一个 epoll 循环,通过一个 eventfd 来传递数据,彼此无需上锁就可以实现同步。

如果是要做一些很简单的事,这样当然反而麻烦了。但是最大好处是:这种机制在线程间,进程间和主机间都一致,所以是有可能让代码(至少是业务代码)无需修改就能任意伸缩的。这也是中间件的好处。

刚才测试了一下线程之间用这种办法通信的性能,个人还比较满意,我测的部分是

1. Writer 往 eventfd 写一个数,然后等着

2. Reader 线程接到 epoll 的通知,醒过来把事件发到事件处理者

3. 事件处理者从 eventfd 把数据读出来

整个过程涉及数个系统调用,以及线程切换,测试表明平均大约花费30微秒,这已经非常不错了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值