打印本文 打印本文 关闭窗口 关闭窗口
linux 2.6内核epoll用法举例说明(续)--给echo服务器增加读线程池
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2850  更新时间:2009/4/22 23:08:18  文章录入:mintao  责任编辑:mintao
nbsp;    ev.data.fd=sockfd;

                 //设置用于注测的读操作事件

               ev.events=EPOLLIN|EPOLLET;

                 //修改sockfd上要处理的事件为EPOLIN

               epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);

               }

                             

          }

         

     }

}

void * readtask(void *args)

{

   

   int fd=-1;

   unsigned int n;

   //用于把读出来的数据传递出去

   struct user_data *data = NULL;

   while(1){

        

        pthread_mutex_lock(&mutex);

        //等待到任务队列不为空

        while(readhead==NULL)

             pthread_cond_wait(&cond1,&mutex);

        

        fd=readhead->fd;

        //从任务队列取出一个读任务

        struct task *tmp=readhead;

        readhead = readhead->next;

        delete tmp;

        pthread_mutex_unlock(&mutex);

        data = new user_data();

        data->fd=fd;

        if ( (n = read(fd, data->line, MAXLINE)) < 0) {

           

           if (errno == ECONNRESET) {

             close(fd);

             

          } else

             std::cout<<"readline error"<<std::endl;

           if(data!=NULL)delete data;

        } else if (n == 0) {

            close(fd);

           printf("Client close connect!\n");

           if(data!=NULL)delete data;

        } else{

        

        data->n_size=n;

        //设置需要传递出去的数据

        ev.data.ptr=data;

        //设置用于注测的写操作事件

        ev.events=EPOLLOUT|EPOLLET;

        //修改sockfd上要处理的事件为EPOLLOUT

        epoll_ctl(epfd,EPOLL_CTL_MOD,fd,&ev);

       }

   }

}

 

上一页  [1] [2] [3] 

打印本文 打印本文 关闭窗口 关闭窗口