青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

epoll是linux下高并發服務器的完美方案,因為是基于事件觸發的,所以比select快的不只是一個數量級。
單線程epoll,觸發量可達到15000,但是加上業務后,因為大多數業務都與數據庫打交道,所以就會存在阻塞的情況,這個時候就必須用多線程來提速。
業務在線程池內,這里要加鎖才行。測試結果2300個/s
測試工具:stressmark
因為加了適用與ab的代碼,所以也可以適用ab進行壓力測試。
char buf[1000] = {0};
sprintf(buf,"HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n%s","Hello world!\n");
send(socketfd,buf, strlen(buf),0);
#include <iostream>
#include 
<sys/socket.h>
#include 
<sys/epoll.h>
#include 
<netinet/in.h>
#include 
<arpa/inet.h>
#include 
<fcntl.h>
#include 
<unistd.h>
#include 
<stdio.h>
#include 
<pthread.h>

#include 
<errno.h>
 
#define MAXLINE 10
#define OPEN_MAX 100
#define LISTENQ 20
#define SERV_PORT 8006
#define INFTIM 1000
 
//線程池任務隊列結構體

struct task{
  
int fd; //需要讀寫的文件描述符

  
struct task *next; //下一個任務

}
;
 
//用于讀寫兩個的兩個方面傳遞參數

struct user_data{
  
int fd;
  unsigned 
int n_size;
  
char line[MAXLINE];
}
;
 
//線程的任務函數

void * readtask(void *args);
void * writetask(void *args);
 
 
//聲明epoll_event結構體的變量,ev用于注冊事件,數組用于回傳要處理的事件

struct epoll_event ev,events[20];
int epfd;
pthread_mutex_t mutex;
pthread_cond_t cond1;
struct task *readhead=NULL,*readtail=NULL,*writehead=NULL;
 
void setnonblocking(int sock)
{
     
int opts;
     opts
=fcntl(sock,F_GETFL);
     
if(opts<0)
     
{
          perror(
"fcntl(sock,GETFL)");
          exit(
1);
     }

    opts 
= opts|O_NONBLOCK;
     
if(fcntl(sock,F_SETFL,opts)<0)
     
{
          perror(
"fcntl(sock,SETFL,opts)");
          exit(
1);
     }
 
}

 
int main()
{
     
int i, maxi, listenfd, connfd, sockfd,nfds;
     pthread_t tid1,tid2;
    
     
struct task *new_task=NULL;
     
struct user_data *rdata=NULL;
     socklen_t clilen;
    
     pthread_mutex_init(
&mutex,NULL);
     pthread_cond_init(
&cond1,NULL);
     
//初始化用于讀線程池的線程

     pthread_create(
&tid1,NULL,readtask,NULL);
     pthread_create(
&tid2,NULL,readtask,NULL);
    
     
//生成用于處理accept的epoll專用的文件描述符 

     epfd
=epoll_create(256);
 
     
struct sockaddr_in clientaddr;
     
struct sockaddr_in serveraddr;
     listenfd 
= socket(AF_INET, SOCK_STREAM, 0);
     
//把socket設置為非阻塞方式

     setnonblocking(listenfd);
     
//設置與要處理的事件相關的文件描述符

     ev.data.fd
=listenfd;
     
//設置要處理的事件類型

     ev.events
=EPOLLIN|EPOLLET;
     
//注冊epoll事件

     epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,
&ev);
    
     bzero(
&serveraddr, sizeof(serveraddr)); 
     serveraddr.sin_family 
= AF_INET; 
     serveraddr.sin_port
=htons(SERV_PORT);
     serveraddr.sin_addr.s_addr 
= INADDR_ANY;
     bind(listenfd,(sockaddr 
*)&serveraddr, sizeof(serveraddr));
     listen(listenfd, LISTENQ);
    
     maxi 
= 0;
     
for ( ; ; ) {
          
//等待epoll事件的發生

          nfds
=epoll_wait(epfd,events,20,500);
          
//處理所發生的所有事件 

        
for(i=0;i<nfds;++i)
        
{
               
if(events[i].data.fd==listenfd)
               
{
                   
                    connfd 
= accept(listenfd,(sockaddr *)&clientaddr, &clilen);
                    
if(connfd<0){
                      perror(
"connfd<0");
                      exit(
1);
                   }

                    setnonblocking(connfd);
                   
                    
char *str = inet_ntoa(clientaddr.sin_addr);
                    
//std::cout<<"connec_ from >>"<<str<<std::endl;

                    
//設置用于讀操作的文件描述符

                    ev.data.fd
=connfd;
                    
//設置用于注測的讀操作事件

                 ev.events
=EPOLLIN|EPOLLET;
                    
//注冊ev

                 epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,
&ev);
               }

            
else if(events[i].events&EPOLLIN)
            
{
                    
//printf("reading!/n"); 

                    
if ( (sockfd = events[i].data.fd) < 0continue;
                    new_task
=new task();
                    new_task
->fd=sockfd;
                    new_task
->next=NULL;
                    
//添加新的讀任務

                    pthread_mutex_lock(
&mutex);
                    
if(readhead==NULL)
                    
{
                      readhead
=new_task;
                      readtail
=new_task;
                    }
 
                    
else
                    

                     readtail
->next=new_task;
                      readtail
=new_task;
                    }
 
                   
//喚醒所有等待cond1條件的線程

                    pthread_cond_broadcast(
&cond1);
                    pthread_mutex_unlock(
&mutex); 
              }

               
else if(events[i].events&EPOLLOUT)
               

                 
/*
              rdata=(struct user_data *)events[i].data.ptr;
                 sockfd = rdata->fd;
                 write(sockfd, rdata->line, rdata->n_size);
                 delete rdata;
                 //設置用于讀操作的文件描述符
                 ev.data.fd=sockfd;
                 //設置用于注測的讀操作事件
               ev.events=EPOLLIN|EPOLLET;
                 //修改sockfd上要處理的事件為EPOLIN
               epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
             
*/

               }

                             
          }

         
     }

}


static int count111 = 0;
static time_t oldtime = 0, nowtime = 0;
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;
        

        
char recvBuf[1024= {0}
        
int ret = 999;
        
int rs = 1;

        
while(rs)
        
{
            ret 
= recv(fd,recvBuf,1024,0);// 接受客戶端消息

            
if(ret < 0)
            
{
                
//由于是非阻塞的模式,所以當errno為EAGAIN時,表示當前緩沖區已無數據可//讀在這里就當作是該次事件已處理過。

                
if(errno == EAGAIN)
                
{
                    printf(
"EAGAIN\n");
                    
break;
                }

                
else{
                    printf(
"recv error!\n");
        
                    close(fd);
                    
break;
                }

            }

            
else if(ret == 0)
            
{
                
// 這里表示對端的socket已正常關閉. 

                rs 
= 0;
            }

            
if(ret == sizeof(recvBuf))
                rs 
= 1// 需要再次讀取

            
else
                rs 
= 0;
        }

        
if(ret>0){

        
//-------------------------------------------------------------------------------


            data
->n_size=n;


            count111 
++;

            
struct tm *today;
            time_t ltime;
            time( 
&nowtime );

            
if(nowtime != oldtime){
                printf(
"%d\n", count111);
                oldtime 
= nowtime;
                count111 
= 0;
            }


            
char buf[1000= {0};
            sprintf(buf,
"HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n%s","Hello world!\n");
            send(fd,buf,strlen(buf),
0);
            close(fd);


       }

   }

}



posted on 2013-11-26 15:49 C++技術中心 閱讀(5792) 評論(2)  編輯 收藏 引用 所屬分類: Linux 編程

Feedback

# re: 高并發的epoll+線程池,業務在線程池內[未登錄] 2013-11-27 12:05 春秋十二月
這個例子實現描述的epoll+theadpool方案不太好
1)fd讀事件用加鎖的queue通知,造成epoll thead和read thread間的同步,及many read threads間的鎖競爭
2)fd寫事件沒有處理,后面的send(fd,buf,strlen(buf),0)也沒處理好  回復  更多評論
  

# re: 高并發的epoll+線程池,業務在線程池內 2013-11-27 18:34 老爺
大哥, 你可以封裝下啊, 你不覺得看起來挺費勁嗎? 看起來費勁, 用起來就更不用說了~  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲盗摄视频| 欧美视频中文在线看| 老牛嫩草一区二区三区日本 | 亚洲天天影视| 亚洲激情在线视频| 欧美激情亚洲| 亚洲砖区区免费| 米奇777在线欧美播放| 亚洲视频香蕉人妖| 在线精品观看| 欧美一区二区三区在线| 欧美国产一区二区三区激情无套| 99热这里只有成人精品国产| 欧美一区日本一区韩国一区| 国产性天天综合网| 欧美金8天国| 国产日韩在线一区二区三区| 国产婷婷色一区二区三区在线| 狠狠色伊人亚洲综合网站色| 欧美精品在线观看| 欧美国产专区| 欧美激情综合亚洲一二区| 欧美日韩在线一区二区三区| 亚洲黄色av一区| 久久免费99精品久久久久久| 亚洲欧美激情精品一区二区| 欧美大片免费久久精品三p | 在线精品视频免费观看| 99国产精品国产精品久久| 亚洲精品资源美女情侣酒店| 亚洲人成毛片在线播放| 亚洲深夜影院| 久久在线精品| 欧美在线视频一区二区| 亚洲二区三区四区| 亚洲国产精品一区在线观看不卡| 亚洲免费视频中文字幕| 国产精品多人| 伊人精品视频| 亚洲自拍啪啪| 嫩草影视亚洲| 亚洲激情视频| 99国产精品久久久久久久成人热| 久久久久久久久久久久久久一区| 欧美成人自拍视频| 欧美一级大片在线免费观看| 国产精品嫩草影院av蜜臀| 在线观看亚洲a| 亚洲黄色av一区| 国产在线不卡| 久久久久综合| 欧美在线一级视频| 亚洲精品一区在线| 亚洲欧美国产另类| 亚洲久久一区二区| 亚洲欧美日本伦理| 国产精品剧情在线亚洲| 久久精品一区二区国产| 欧美激情四色| 欧美国产视频日韩| 在线 亚洲欧美在线综合一区| 亚洲高清视频在线| 好吊日精品视频| 久久精品导航| 黄色成人在线免费| 亚洲综合色在线| 欧美一级一区| 毛片av中文字幕一区二区| 亚洲国产99精品国自产| 麻豆91精品91久久久的内涵| 久久亚洲综合色| 久久久久久久性| 激情久久久久| 一区二区欧美视频| 国产欧美亚洲日本| 女主播福利一区| 亚洲激情欧美激情| 欧美r片在线| 久久久91精品国产| 国产精品素人视频| 一二三四社区欧美黄| 美女福利精品视频| 日韩视频精品在线| 亚洲精选91| 国产目拍亚洲精品99久久精品| 午夜日本精品| 欧美精品在线播放| av成人动漫| 日韩一级大片| 亚洲欧美三级伦理| 欧美一区二区三区的| 中文日韩在线| 在线精品亚洲一区二区| 国产精品成人一区二区三区吃奶| 亚洲一线二线三线久久久| 好吊妞**欧美| 欧美手机在线| 欧美v日韩v国产v| 亚洲一区二区三区四区五区黄 | 一区二区免费在线视频| 久久精品国产久精国产思思| 国产精品r级在线| 久久精品主播| 亚洲视屏一区| 日韩视频在线观看免费| 在线看片一区| 狠狠色伊人亚洲综合网站色| 国产一区二三区| 国产精品欧美一区喷水| 欧美日韩在线视频一区| 欧美日本二区| 国产精品白丝av嫩草影院 | 欧美福利在线| 欧美精品1区2区3区| 猛干欧美女孩| 欧美日韩国产欧美日美国产精品| 美乳少妇欧美精品| 另类av导航| 亚洲日本无吗高清不卡| 中文久久精品| 亚洲欧美一级二级三级| 国产精品久久久免费| 欧美另类在线观看| 国产精品男女猛烈高潮激情| 国产女主播一区二区三区| 黄色成人片子| 亚洲一区二区三区四区在线观看| 国产精品一卡| 极品av少妇一区二区| 99国产精品久久| 久久久午夜视频| 亚洲一区精品在线| 欧美成在线视频| 国产一本一道久久香蕉| 国产女精品视频网站免费| 国内精品伊人久久久久av影院 | 一区二区电影免费在线观看| 亚洲欧美一区二区三区久久| 欧美成人综合网站| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲在线视频一区| 亚洲黑丝在线| 欧美成人小视频| 亚洲高清中文字幕| 久久综合久久久久88| 午夜精品久久久久久久99热浪潮| 欧美日韩不卡合集视频| 亚洲精品免费网站| 亚洲欧美成aⅴ人在线观看| 亚洲自拍三区| 亚洲午夜精品17c| 亚洲精品中文字幕在线观看| 美女免费视频一区| 伊人夜夜躁av伊人久久| 欧美 日韩 国产 一区| 麻豆av福利av久久av| 亚洲国产另类久久精品| 欧美成人精品在线| 欧美韩日亚洲| 性做久久久久久久免费看| 欧美一区二区私人影院日本| 1024国产精品| 一区二区免费在线视频| 国产真实乱偷精品视频免| 久久一日本道色综合久久| 久久人人九九| 亚洲欧美国产精品va在线观看| 欧美一区二区成人| 亚洲香蕉视频| 欧美不卡福利| 久久躁日日躁aaaaxxxx| 欧美日韩日本网| 亚洲国产精品一区二区第四页av| 农村妇女精品| 国产欧美日韩专区发布| 最新日韩在线| 黄色av日韩| 欧美一区二区三区在| 亚洲午夜伦理| 欧美日韩一区二区三区免费| 久久久噜噜噜久久狠狠50岁| 欧美精品在线播放| 欧美国产精品va在线观看| 韩国欧美一区| 欧美伊人久久久久久午夜久久久久| 亚洲免费黄色| 欧美日韩在线视频一区二区| 欧美激情五月| 亚洲美女诱惑| 欧美视频成人| 亚洲一区二区在线观看视频| 亚洲一级影院| 国产精品一二三四| 性欧美18~19sex高清播放| 国产欧美一区二区三区视频| 在线综合+亚洲+欧美中文字幕| 国产精品一区二区三区乱码| 亚洲伦理久久| 欧美视频一区二区| 午夜精品一区二区三区四区 |