这是一个关于这个答案的问题:https : //stackoverflow.com/a/14241095/2332808 (会评论它,但新创建的帐户显然不能,对于噪音感到抱歉。很难找到关于 epollet/multithreading 的资源.. .)
它建议使用 epoll 如下:
epoll_ctl()
激活通知(如果EPOLLONESHOT
使用则重新激活)。- 系统输入://
read()
循环直到出错。recv()
accept()
EAGAIN
epoll_wait()
接收通知。
epoll_wait()
但是,假设在同一个 epollfd 上有多个线程,如果它在您完成读取之前接收到更多数据(例如,最终两个线程处理同一个 fd )
即使你把事情转过来read()
直到EAGAIN
,epoll_ctl()
然后read()
再次打电话来检查仍然没有任何东西(以避免在最后一次阅读和 之间你会收到一些东西的比赛epoll_ctl()
)......
但是仍然不能保证您在 之后实际上不会收到任何东西,epoll_ctl()
并且最后一次read()
检查和另一个线程都被唤醒,再次在同一个 fd 上工作......
我想每个 fd 都有一个锁是一个可以接受的解决方案,但是在边缘触发模式下“批准”使用 epoll 并且多个线程在同一个 epollfd 上轮询?