带有边缘触发,一次性和多线程的epoll

时间:2013-04-29 16:41:53

标签: multithreading epoll epollet

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

建议使用epoll作为以下内容:

  1. epoll_ctl()激活通知(如果使用EPOLLONESHOT则重新激活)。
  2. 系统输入:read() / recv() / accept()循环,直到错误EAGAIN
  3. epoll_wait()接收通知。
  4. 但是,假设同一个epollfd中的epoll_wait()中存在多个线程,如果在读完之前接收到更多数据(例如结束),则不会有另一个线程在同一个fd上被唤醒的风险用两个线程处理相同的fd)

    即使你转过身来read()EAGAINepoll_ctl(),然后再次打电话给read()检查那里仍然没有(为了避免你所在的比赛)收到上次阅读和epoll_ctl()之间的内容...

    仍然无法保证您在epoll_ctl()之后实际上没有收到任何内容,并且最后read()检查并且另一个线程被唤醒工作在同一个fd再次......

    我认为每个fd锁一次是一个可接受的解决方案,但是在边缘触发模式中“epused”使用epoll,多个线程在同一个epollfd上进行轮询吗?

1 个答案:

答案 0 :(得分:0)

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