Linux簡單高併發模型 Epoll 執行緒池

2021-07-30 15:44:24 字數 3660 閱讀 9376

首先是乙個locker.h的檔案,封裝了訊號量、互斥量、條件變數。

locker.h檔案:

#ifndef _locker_h_

#define _locker_h_

#include #include #include /*訊號量的類*/

class sem_locker

//銷毀訊號量

~sem_locker()

//等待訊號量

bool wait()

//新增訊號量

bool add()

};/*互斥 locker*/

class mutex_locker

~mutex_locker()

bool mutex_lock() //lock mutex

bool mutex_unlock() //unlock

};/*條件變數 locker*/

class cond_locker

}// destroy mutex and cond

~cond_locker()

//等待條件變數

bool wait()

//喚醒等待條件變數的執行緒

bool signal()

//喚醒all等待條件變數的執行緒

bool broadcast()

};#endif

thread_pool.h檔案。

建立threadnum個執行緒,並呼叫pthread_detach()分離執行緒,執行緒結束,自動**資源。(前面的一篇部落格的執行緒池有bug,不完整,執行緒池退出時,不能讓所有的執行緒正常退出)

#ifndef _pthread_pool_

#define _pthread_pool_

#include "locker.h"

#include #include #include #include #include #include templateclass threadpool

;template threadpool::threadpool(int thread_num):

thread_number(thread_num),is_stop(false), all_threads(null)

template threadpool::~threadpool()

template void threadpool::stop() //執行緒池停止

template void threadpool::start() //執行緒池啟動

if(pthread_detach(all_threads[i]))

}}//新增任務進入任務佇列

return true;

}template void *threadpool::worker(void *arg) //執行緒工作函式

template t* threadpool::gettask() //從任務佇列中獲取任務

queue_mutex_locker.mutex_unlock();

return task;

}template void threadpool::run()

//for test

//printf("exit%d\n", (unsigned long)pthread_self());

}#endif

封裝了epoll。

epollserver.h中的basetask.h和task.h應該放在另外乙個檔案中的。這裡圖個方便,哈哈。

#ifndef _epoll_server_h_

#define _epoll_server_h_

#include #include #include #include #include #include #include #include #include #include #include #include //#include #include "thread_pool.h"

#define max_event 1024 //epoll_events的最大個數

#define max_buffer 2048 //buffer的最大位元組

class basetask

;class task : public basetask

void doit() //任務的執行函式 };

class epollserver

epollserver(int ports, int thread) : is_stop(false) , threadnum(thread) ,

port(ports), pool(null)

~epollserver() //析構

void init();

void epoll();

static int setnonblocking(int fd) //將fd設定稱非阻塞

static void addfd(int epollfd, int sockfd, bool oneshot) //向epoll中新增fd

epoll_ctl(epollfd, epoll_ctl_add, sockfd, &event); //新增fd

epollserver::setnonblocking(sockfd);

}};void epollserver::init() //epollserver的初始化

int ret = bind(sockfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr));

if(ret < 0)

ret = listen(sockfd, 10);

if(ret < 0)

//create epoll

epollfd = epoll_create(1024);

if(epollfd < 0)

pool = new threadpool(threadnum); //建立執行緒池

}void epollserver::epoll()

for(int i = 0; i < ret; ++i)

else if(events[i].events & epollin) //某個fd上有資料可讀

else if(ret < 0)//讀取出錯,嘗試再次讀取

}else//成功讀取,向執行緒池中新增任務

}else

}} close(sockfd);//結束。

pool->stop();

}#endif

接下來是簡單的demo的測試。

#include "epollserver.h"

int main(int argc, char const *argv)

int port = atoi(argv[1]);

if(port == 0)

int threadnum = atoi(argv[2]);

if(port == 0)

epollserver *epoll = new epollserver(port, threadnum);

epoll->init();

epoll->epoll();

return 0;

}

**在ubuntu中編譯通過。下次再來更新能夠支援併發量的多少。

簡單高併發C S模型

使用了自己做的通用api函式庫,參考之前的文章 網路程式設計中的select實現超時檢測和通用api 多程序 共享記憶體 訊號量綜合例項 客戶端 include comsocket.h include void handle int signum int main int datalen 10 in...

tomcat高併發apr io模型

linux上配置tomcat apr高併發io模型 前情 本人的開發環境 centos7,tomcat8.0.44,jdk1.7.0 79 安裝apr遇到問題 tomcat8.044 需要openssl1.02以上版本 準備條件 必須有網路 安裝gcc gcc 環境 安裝openssl的庫 安裝ap...

Linux高併發概念

高併發 high concurrency 是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。吞吐量 throughput 每秒查詢率qps query per second 併發使用者數 user concurrence 單程序最大開啟檔案數限制...