epoll是linux下高併發伺服器的完美方案,因為是基於事件觸發的,所以比select快的不只是乙個數量級。
單執行緒epoll,觸發量可達到15000,但是加上業務後,因為大多數業務都與資料庫打交道,所以就會存在阻塞的情況,這個時候就必須用多執行緒來提速。
測試工具:stressmark
因為加了適用與ab的**,所以也可以適用ab進行壓力測試。
//執行緒池任務佇列結構體
struct task
;//用於讀寫兩個的兩個方面傳遞引數
struct user_data
;//執行緒的任務函式
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)
opts = opts|o_nonblock;
if(fcntl(sock,f_setfl,opts)
<0)
}int main(
)setnonblocking(connfd)
;char
*str = inet_ntoa(clientaddr.sin_addr)
;//std::cout<<"connec_ from >>"<
//設定用於讀操作的檔案描述符
ev.data.fd=connfd;
//設定用於注測的讀操作事件
ev.events=epollin|epollet;
//註冊ev
epoll_ctl(epfd,epoll_ctl_add,connfd,
&ev);}
else
if(events[i]
.events&epollin)
else
//喚醒所有等待cond1條件的執行緒
pthread_cond_broadcast
(&cond1)
;pthread_mutex_unlock
(&mutex);}
else
if(events[i]
.events&epollout)}}
}static
int count111 = 0;
static
time_t oldtime = 0, nowtime = 0;
void
* readtask(
void
*args)
;int ret = 999;
int rs = 1;
while
(rs)
else
}else
if(ret =
= 0)
if(ret =
=sizeof
(recvbuf)
)rs = 1;
// 需要再次讀取
epoll 執行緒池 資料庫連線池
使用者每次請求都需要向資料庫獲得鏈結,而資料庫建立連線通常需要消耗相對較大的資源,建立時間也較長。假設 一天10萬訪問量,資料庫伺服器就需要建立10萬次連線,極大的浪費資料庫的資源,並且極易造成資料庫伺服器記憶體溢位 拓機。如下圖所示 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應...
C 執行緒 執行緒池 epoll和IOCP之比較
總結 iocp 我的列印檔案放在店裡面排隊,輪到我列印了,店長幫我列印一下,列印好了通知我來拿 epoll 我的列印檔案放在店裡面排隊,輪到我叫我一下,我自己來列印。直入正題 epoll 是linux系統下的模型 iocp 是windows下模型 epoll 是當事件資源滿足時發出可處理通知訊息 i...
Linux簡單高併發模型 Epoll 執行緒池
首先是乙個locker.h的檔案,封裝了訊號量 互斥量 條件變數。locker.h檔案 ifndef locker h define locker h include include include 訊號量的類 class sem locker 銷毀訊號量 sem locker 等待訊號量 bool...