用 eventfd 在线程之间通信

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

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

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

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

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

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

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

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

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

你可能感兴趣的:(用 eventfd 在线程之间通信)