求你一个多线程同时epoll_wait的实例。

飞翔的薄荷 2013-04-19 10:48:16
总觉得有很多无法解决的问题,比如:
1、想read时调用epoll_ctl时无法确定是否需要EPOLLOUT。想write时调用epoll_ctl时无法确定是否需要EPOLLIN。
2、一个线程epoll_wait返回后,还没来得及调用read或write函数,另一个线程调用epoll_ctl,导致第三个线程的epoll_wait返回。
最难的是第二个问题。
...全文
701 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rem2002 2014-03-06
  • 打赏
  • 举报
回复
我也在纠结这个问题啊, 不是 读,就是写,这不等于是单工的了,我刚开始以为 epoll_ctl 可以对同一fd 注册读、写两事件,测试时不能,期望交流。
飞翔的薄荷 2013-04-24
  • 打赏
  • 举报
回复
为什么要多个线程操作epoll?一个线程收发包,其他线程负责处理逻辑不好吗: 我的代码要在windows和linux下都能跑,因此希望两种逻辑结构都差不多。windows下就是多个线程同时等待一个完成端口。 就问题本身而言,多线程操作同一个对象,还是加锁或者用队列更安全。 不能加锁,加锁后相当于一个线程。 搞定了没?可以探讨一下。 因为其它项目,这个项目挂起了。
tommwq 2013-04-21
  • 打赏
  • 举报
回复
为什么要多个线程操作epoll?一个线程收发包,其他线程负责处理逻辑不好吗? 就问题本身而言,多线程操作同一个对象,还是加锁或者用队列更安全。
heartlesstoanyone 2013-04-21
  • 打赏
  • 举报
回复
搞定了没?可以探讨一下。
飞翔的薄荷 2013-04-19
  • 打赏
  • 举报
回复
写错了,write应该是recv。
飞翔的薄荷 2013-04-19
  • 打赏
  • 举报
回复
我知道用EPOLLONESHOT清理掉,但是另一个线程使用epoll_ctl后,又被加上了。 比如我想处理一个write事件,需要加入EPOLLIN,一个线程epoll_wait返回,但还没来得及处理我的代码(也就是我还不知道要清理掉EPOLLIN)。另一个线程请求一个send,需要加入EPOLLOUT,此时调用epoll_ctl看到EPOLLIN还没有处理,所有epoll_ctl使用EPOLLIN|EPOLLOUT。然后悲剧了,有两个线程同时处理EPOLLIN。
qq120848369 2013-04-19
  • 打赏
  • 举报
回复
1,根本不是问题,这只能说明你不会设计代码。 2,了解EPOLLONESHOT选项,可以帮助你多线程共享同一个epoll set的原子性,从模式来说这叫做leader-follower模型。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧