免费注册 查看新帖 |

Chinaunix

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

[网络] epoll_ctl epoll_wait 不同线程调用为什么会导致程序直接崩溃? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-17 11:34 |只看该作者 |倒序浏览
本帖最后由 jiangjkd 于 2014-03-17 11:36 编辑

主线程 就是创建一个 epoll_fd  并且把监听端口加入epoll事件列表:
        epoll_fd = epoll_create(MAX_DESCRIPTORS);
        if(epoll_fd == INVALID_SOCKET)
        {
                return false;
        }
        epoll_event ev;
        memset(&ev, 0, sizeof(epoll_event));
        ev.events = EPOLLIN | EPOLLET;
        ev.data.fd = m_listenFd;
        if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, m_listenFd, &ev) < 0)
        {
                return -1;
        }
        else
        {
                cout<<"监听 socket 加入 epoll 成功!"<<endl;
        }
子线程1 循环调用epoll_wait 处理 接收连接  读写事件:
       const static int maxevents = MAXEPOLLSIZE;
        epoll_event events[MAXEPOLLSIZE];
        int nfds, i;
        SOCKET s;

        while(m_running)
       {
                nfds = epoll_wait(epoll_fd, events, maxevents,-1);

                for(i = 0; i < nfds; ++i)
                {
                        if(events.data.fd == m_listenFd)
                        {
                                cout<<"Do Accept"<<endl;
                                DoAccept();
                        }
                        else
                        {
                                s = events.data.fd;
       
                                if(s == 0)
                                {
                                        printf("epoll returned invalid fd %u\n", events.data.fd);
                                        continue;
                                }

                                if(events.events & EPOLLHUP || events.events & EPOLLERR)
                                {
                                        WantClose(s);
                                }
                                else if(events.events & EPOLLIN)
                                {
                                        while(OnRecvTCPProc());
                                }
                                else if(events.events & EPOLLOUT)
                                {
                                        while(OnSendTCPProc());

                                }

                        }
                }
        }
子线程2:
        调用 epoll_ctl,EPOLL_CTL_DEL 来删除一个socket,结果导致程序崩溃,直接消失, 这是为什么?
        struct epoll_event ev;
        memset(&ev, 0, sizeof(epoll_event));
        ev.data.fd = fd;

        int ret = epoll_ctl(epoll_fd, EPOLL_CTL_DEL,fd, &ev);


epoll_ctl epoll_wait 只能在同一个线程中使用吗?
      

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-03-17 11:45 |只看该作者
怎么崩溃?总有core文件或信号这些信息吧,先别怀疑epoll,看看自己线程同步有没有BUG

论坛徽章:
0
3 [报告]
发表于 2014-03-17 11:56 |只看该作者
本帖最后由 jiangjkd 于 2014-03-17 11:57 编辑

我代码就是三个线程,线程1接收新的连接,把fd传给线程2,线程2就直接调用        int ret = epoll_ctl(epoll_fd, EPOLL_CTL_DEL,fd, &ev);


我就是断点到这一步,再走下一步,程序就直接消失,没任何错误信息。


epoll_ctl 和 epoll_wait 能在不同的线程里面调用吗? 如果可以的话,这两个函数的同步需要注意什么呢?

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
4 [报告]
发表于 2014-03-17 15:34 |只看该作者
怎么保证先执行的线程1,后执行的线程2?

论坛徽章:
0
5 [报告]
发表于 2014-03-17 20:54 |只看该作者
问题找到了,自己线程同步的疏忽。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP