这是一个关于这个答案的问题: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 上轮询?