1

这是一个关于这个答案的问题:https : //stackoverflow.com/a/14241095/2332808 (会评论它,但新创建的帐户显然不能,对于噪音感到抱歉。很难找到关于 epollet/multithreading 的资源.. .)

它建议使用 epoll 如下:

  1. epoll_ctl()激活通知(如果EPOLLONESHOT使用则重新激活)。
  2. 系统输入://read()循环直到出错。recv()accept()EAGAIN
  3. epoll_wait()接收通知。

epoll_wait()但是,假设在同一个 epollfd 上有多个线程,如果它在您完成读取之前接收到更多数据(例如,最终两个线程处理同一个 fd )

即使你把事情转过来read()直到EAGAINepoll_ctl()然后read()再次打电话来检查仍然没有任何东西(以避免在最后一次阅读和 之间你会收到一些东西的比赛epoll_ctl())......

但是仍然不能保证您在 之后实际上不会收到任何东西,epoll_ctl()并且最后一次read()检查和另一个线程都被唤醒,再次在同一个 fd 上工作......

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

4

1 回答 1

0

是的,您仍然需要进行适当的锁定以防止您描述的那些情况 - 并且为每个 fd 使用锁定是最明智的方法。

于 2013-04-29T18:46:12.253 回答