jiangjkd 发表于 2014-03-17 11:34

epoll_ctl epoll_wait 不同线程调用为什么会导致程序直接崩溃?

本帖最后由 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;
        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 只能在同一个线程中使用吗?
      

timespace 发表于 2014-03-17 11:45

怎么崩溃?总有core文件或信号这些信息吧,先别怀疑epoll,看看自己线程同步有没有BUG

jiangjkd 发表于 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 能在不同的线程里面调用吗? 如果可以的话,这两个函数的同步需要注意什么呢?

weishuo1999 发表于 2014-03-17 15:34

怎么保证先执行的线程1,后执行的线程2?

jiangjkd 发表于 2014-03-17 20:54

问题找到了,自己线程同步的疏忽。
页: [1]
查看完整版本: epoll_ctl epoll_wait 不同线程调用为什么会导致程序直接崩溃?