对epoll+多线程的用法和效率的疑问,麻烦高手指点!
各位兄弟,我最近才开始接触epoll,现在正在看我们公司一个老员工的代码。该程序主要有如下几个部分:
1.网络接入层封装成了一个class Poll,负责epoll_create,listen和监听EPOLLIN,EPOLLOUT等事件(ET模式)
2.然后一旦从客户端收到(recv)了数据以后,将其构造成一个消息,放入消息队列中
3.若干工作线程竞争,从消息队列中取出消息并进行处理,然后把处理结果发送(send)给客户端。
我的问题在这里:
1)上面的流程中,工作线程处理完了消息以后是直接使用send来发送结果的,并没有判断这个连接是否处于EPOLLOUT状态,这样会有什么问题吗?
2)如果上述的流程有问题,那么我想到的解决方案就是将处理结果丢给负责网络接入的线程(就是上面第一点说道的那个class对应的线程)。那么因为所有的网络收包和发包都由同一个线程来处理,会不会存在性能问题,甚至影响到新的连接的接入或者其它?
3)如果由同一个线程处理网络方面的收发包存在性能问题,有没有好的办法解决呢?
这个问题我考虑了一天,还是没有考虑清楚,恳请各位高手指点。
1.网络接入层封装成了一个class Poll,负责epoll_create,listen和监听EPOLLIN,EPOLLOUT等事件(ET模式)
2.然后一旦从客户端收到(recv)了数据以后,将其构造成一个消息,放入消息队列中
3.若干工作线程竞争,从消息队列中取出消息并进行处理,然后把处理结果发送(send)给客户端。
我的问题在这里:
1)上面的流程中,工作线程处理完了消息以后是直接使用send来发送结果的,并没有判断这个连接是否处于EPOLLOUT状态,这样会有什么问题吗?
2)如果上述的流程有问题,那么我想到的解决方案就是将处理结果丢给负责网络接入的线程(就是上面第一点说道的那个class对应的线程)。那么因为所有的网络收包和发包都由同一个线程来处理,会不会存在性能问题,甚至影响到新的连接的接入或者其它?
3)如果由同一个线程处理网络方面的收发包存在性能问题,有没有好的办法解决呢?
这个问题我考虑了一天,还是没有考虑清楚,恳请各位高手指点。
...全文
相关推荐
Linux下使用EPoll+队列+多线程的C++实现
该源代码使用linux的网络IO多路复用模型epoll在建立tcpserver,对用队列来缓存请求,使用线程池来处理请求。
Linux网络编程(四)——epoll+多线程实现简单的聊天(linux 服务器端 windows客户端)
Linux网络编程(四)——epoll+多线程实现简单的聊天(linux 服务器端 windows客户端)
epoll 多线程 线程池
最近做工程用到了这些知识,因此总结一些这方面的资料,我认为还是比较有用的,通过这些资料,大概一天就可以学会噢~
epoll的用法
epoll的用法,网络多路I/O复用技术,网上照抄的,很不错。
epoll-benchmarks:适用于多线程epoll应用程序的基准套件
原始套接字 参考


