epoll 執行緒池

2021-07-03 16:24:27 字數 2612 閱讀 9949

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...