这是一个关于这个答案的问题:https://stackoverflow.com/a/14241095/2332808(会对它进行评论,但新创建的帐户显然不能,对于噪音很抱歉。很难找到关于epollet /多线程的资源......)
建议使用epoll作为以下内容:
epoll_ctl()
激活通知(如果使用EPOLLONESHOT
则重新激活)。 read()
/ recv()
/ accept()
循环,直到错误EAGAIN
。epoll_wait()
接收通知。但是,假设同一个epollfd中的epoll_wait()
中存在多个线程,如果在读完之前接收到更多数据(例如结束),则不会有另一个线程在同一个fd上被唤醒的风险用两个线程处理相同的fd)
即使你转过身来read()
到EAGAIN
,epoll_ctl()
,然后再次打电话给read()
检查那里仍然没有(为了避免你所在的比赛)收到上次阅读和epoll_ctl()
之间的内容...
但仍然无法保证您在epoll_ctl()
之后实际上没有收到任何内容,并且最后read()
检查并且另一个线程被唤醒工作在同一个fd再次......
我认为每个fd锁一次是一个可接受的解决方案,但是在边缘触发模式中“epused”使用epoll,多个线程在同一个epollfd上进行轮询吗?
答案 0 :(得分:0)
是的,您仍然需要进行适当的锁定以防止您描述的情况 - 并且每个fd使用锁定是最合理的方法。