免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2821 | 回复: 5
打印 上一主题 下一主题

[C] 请教一个EPOLL和多线程操作的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-10 10:55 |只看该作者 |倒序浏览
请问,我程序使用两个线程,主线程创建了EPOLL,并accept网络连接,并接受来自客户端的数据,并处理数据把结果存到一个结果队列中,结果队列保存数据格式是<fd,处理结果>。,主线程中epoll_wait和epoll_ctl,并读完数据后设置状态为可写。
另外一个线程从这个结果队列取值,根据这个fd,把处理结果返回给客户端。请问,我在写fd之后,是不是需要调用epoll_ctl再改变这个fd的状态啊?如果要改变的话怎么改变啊,主线程创建的epoll没法传给子另外一个线程来处理啊?请指教。谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-06-10 12:11 |只看该作者
同等,

EPOLL_WRITE 是需要在完成以后 epoll_ctl 的,否则会出现出现这个事件 你没有数据可以发送的情况出现。

你的模型里面还缺少一个逻辑thread 是吗

论坛徽章:
0
3 [报告]
发表于 2009-06-10 14:06 |只看该作者
我顶下....看大家讨论.

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
4 [报告]
发表于 2009-06-10 15:07 |只看该作者
并读完数据后设置状态为可写。

你的意思是读完设置EPOLLOUT吧?

你这里好像在主线程接收数据,然后处理数据。  
处理后的数据交给另外的线程发送,那你的主线程就没必要注册EPOLLOUT了。
因为你的发送根本不是EPOLLOUT来驱动的。


假设我理解错了,而你的另一个线程必须改变事件,那你把你的主线程里的epfd放到两个线程都能访问到得地方(例如共同访问的一个类里)。

论坛徽章:
0
5 [报告]
发表于 2009-06-10 15:40 |只看该作者
原帖由 yangsf5 于 2009-6-10 15:07 发表

你的意思是读完设置EPOLLOUT吧?

你这里好像在主线程接收数据,然后处理数据。  
处理后的数据交给另外的线程发送,那你的主线程就没必要注册EPOLLOUT了。
因为你的发送根本不是EPOLLOUT来驱动的。


...

谢谢大家。
是的,我想法就是一个线程监听pth1,并接受数据,接受完后,设置状态为EPOLLOUT,处理结果,结果是放在一个队列中的,由另外的线程pth2把结果返回对应的fd。现在我想,是不是结果返回后,必须pth2要把状态设置成EPOLLIN,否则,pth1就监听不到这个fd的EPOLLIN事件了?

论坛徽章:
0
6 [报告]
发表于 2009-06-10 16:56 |只看该作者
其实,不好弄的是异步epoll_ctl。。。。

在一个线程epoll_wait时,另一个线程epoll_ctl会产生非常搞笑的结果的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP