2013-04-29 64 views
1

这是一个关于这个答案的问题:https://stackoverflow.com/a/14241095/2332808(会评论它,但新创建的帐户显然不能,对于噪音感到遗憾,epollet/multithreading上的资源很难找到.. 。)带边缘触发的epoll,一次性和多线程

它建议使用epoll的,如下所示:

  1. epoll_ctl()以激活通知(并且如果使用EPOLLONESHOT激活)。
  2. 系统输入:在一个循环中read()/recv()/accept()直到错误EAGAIN
  3. epoll_wait()接收通知。

但是,假设有在epoll_wait()多个线程在同一epollfd,如果它收到更多的数据会在读完之前不会被唤醒有另一个线程这种风险还是在同FD(例如,结束了有两个线程处理相同FD)

即使你扭转乾坤,并read()直到EAGAINepoll_ctl()然后再次调用read()检查还是有什么(为了避免比赛,你会接受最后一次读点东西,在epoll_ctl())...

还有我猜有没有保证,你就不会实际收到东西后epoll_ctl()而且会对双方最后read()检查和唤醒在同一FD再次合作另一个线程...

每个fd的锁定将是一个可接受的解决方案,但是在边缘触发模式下“批准”使用epoll并且多个线程在同一个epollfd上轮询?

+0

什么是你想实现这种复杂的机器? EPOLLONESHOT在这里如何帮助你? – 2013-04-29 19:48:09

+0

我有一些用户回调,当有一些FD的活动,所以我试图设置多个线程来保护用户从它本身(例如,如果一个回调块)。我想'EPOLLONESHOT'可以防止多个工作线程在突然的活动高峰期被同一个FD唤醒。 – Asmadeus 2013-04-30 06:57:41

+0

好,从我可以告诉它的作品,我没有功能上的问题,甚至还有用可怕的回调(其中所有的锁都记录下来),在更多的CPU使用成本小的性能提升。我想有一个单独的工作线程池可以从一个单一的epoll循环中唤醒(所以回到'没有边缘或一次性的'EPOLLIN')会是一个更好的设计,但是向工作人员传输信息似乎并不容易我。 – Asmadeus 2013-04-30 08:07:25

回答

0

是的,你仍然需要做适当的锁定,以防止那些你所描述的情况 - 和使用每FD锁是最明智的方法来做到这一点。