1. 程式人生 > >linux c++ 高併發tcp伺服器架構

linux c++ 高併發tcp伺服器架構

 本文轉載自部落格:http://blog.csdn.net/opencpu/article/details/47175813

epoll 接受資料到佇列,執行緒池處理佇列裡的資料
具體實現方式:(只使用使用std的的資料結構,未使用boost)


  1. //============================================================================
  2. // Name        : hmserver.cpp
  3. // Author      : song
  4. // Version     :
  5. // Copyright   : Your copyright notice
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8. #include <stdio.h>
  9. #include <iostream>
  10. usingnamespace std;  
  11. #include "thread_pool.h"
  12. #include "command.h"
  13. int main()  
  14. {  
  15.     ThreadPool thread_pool;  
  16.     thread_pool.InitializeThreads();  
  17.     Command command;  
  18.     char arg[8] = {0};  
  19.     for(int i=1; i<=200; ++i)  
  20.     {  
  21.         command.set_cmd(i%3);  
  22.         sprintf(arg,"%d",i);  
  23.         command.set_arg(arg);  
  24.         thread_pool.AddWork(command);  
  25.     }  
  26.     sleep(30); // 用於測試執行緒池縮容
  27.     thread_pool.ThreadDestroy();  
  28.     return 0;  
  29. }  

thread_pool.cpp
  1. #include <pthread.h>
  2. #include <stdlib.h>
  3. #include "thread_pool.h"
  4. #include "thread_process.h"
  5. #include "command.h"
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. bool ThreadPool::bshutdown_ = false;  
  9. int ThreadPool::icurr_thread_num_ = THREAD_NUM;  
  10. std::vector<Command> ThreadPool::command_;  
  11. std::map<pthread_t,int> ThreadPool::thread_id_map_;  
  12. pthread_mutex_t ThreadPool::command_mutex_ = PTHREAD_MUTEX_INITIALIZER;  
  13. pthread_cond_t ThreadPool::command_cond_ = PTHREAD_COND_INITIALIZER;  
  14. void ThreadPool::InitializeThreads()  
  15. {  
  16.     for (int i = 0; i < THREAD_NUM ; ++i)  
  17.     {  
  18.         pthread_t tempThread;  
  19.         pthread_create(&tempThread, NULL, ThreadPool::Process, NULL);  
  20.         thread_id_map_[tempThread] = 0;  
  21.     }  
  22. }  
  23. void* ThreadPool::Process(void* arg)  
  24. {  
  25.     ThreadProcess threadprocess;  
  26.     Command command;  
  27.     while (true)  
  28.     {  
  29.         pthread_mutex_lock(&command_mutex_);  
  30.         // 如果執行緒需要退出,則此時退出
  31.         if (1 == thread_id_map_[pthread_self()])  
  32.         {  
  33.             pthread_mutex_unlock(&command_mutex_);  
  34.             printf("thread %u will exit\n", pthread_self());  
  35.             pthread_exit(NULL);  
  36.         }  
  37.         // 當執行緒不需要退出且沒有需要處理的任務時,需要縮容的則縮容,不需要的則等待訊號
  38.         if (0 == command_.size() && !bshutdown_)  
  39.         {  
  40.             if(icurr_thread_num_ >  THREAD_NUM)  
  41.             {  
  42.                 DeleteThread();  
  43.                 if (1 == thread_id_map_[pthread_self()])  
  44.                 {  
  45.                     pthread_mutex_unlock(&command_mutex_);  
  46.                     printf("thread %u will exit\n", pthread_self());  
  47.                     pthread_exit(NULL);  
  48.                 }  
  49.             }  
  50.             pthread_cond_wait(&command_cond_,&command_mutex_);  
  51.         }  
  52.         // 執行緒池需要關閉,關閉已有的鎖,執行緒退出
  53.         if(bshutdown_)  
  54.         {  
  55.             pthread_mutex_unlock (&command_mutex_);  
  56.             printf ("thread %u will exit\n", pthread_self ());  
  57.             pthread_exit (NULL);  
  58.         }  
  59.         // 如果執行緒池的最大執行緒數不等於初始執行緒數,則表明需要擴容
  60.         if(icurr_thread_num_ < command_.size())  
  61.         {  
  62.             AddThread();  
  63.         }  
  64.         // 從容器中取出待辦任務
  65.         std::vector<Command>::iterator iter = command_.begin();  
  66.         command.set_arg(iter->get_arg());  
  67.         command.set_cmd(iter->get_cmd());  
  68.         command_.erase(iter);  
  69.         pthread_mutex_unlock(&command_mutex_);  
  70.         // 開始業務處理
  71.         switch(command.get_cmd())  
  72.         {  
  73.         case 0:  
  74.             threadprocess.Process0(command.get_arg());  
  75.             break;  
  76.         case 1:  
  77.             threadprocess.Process1(command.get_arg());  
  78.             break;  
  79.         case 2:  
  80.             threadprocess.Process2(command.get_arg());  
  81.             break;  
  82.         default:  
  83.             break;  
  84.         }  
  85.     }  
  86.     return NULL; // 完全為了消除警告(eclipse編寫的程式碼,警告很煩人)
  87. }  
  88. void ThreadPool::AddWork(Command command)  
  89. {  
  90. 相關推薦

    linux c++ 併發tcp伺服器架構

     本文轉載自部落格:http://blog.csdn.net/opencpu/article/details/47175813 epoll 接受資料到佇列,執行緒池處理佇列裡的資料 具體實現方式:(只使用使用std的的資料結構,未使用boost)

    高效能、併發TCP伺服器(多執行緒呼叫libevent)

    本文講述的TCP伺服器是模仿memcache中的TCP網路處理框架,其中是基於libevent網路庫的。 主執行緒只處理監聽客戶端的連線請求,並將請求平均分配給子執行緒。 子執行緒處理與客戶端的連線以及相關業務。 每個子執行緒有一個“連線”佇列。每個“連線”有一個“反饋”佇列。 先上個流程圖,要上班了

    Nginx 併發TCP請求Linux系統引數配置

    需要修改/etc/sysctl.conf來更改核心引數 #原有欄位   net.ipv4.tcp_syncookies = 1   #新增欄位   fs.file-max = 999999   net.ipv4.tcp_tw_reuse = 1   net.ipv4.tcp

    Linux併發伺服器模型(多程序模型和多執行緒模型)

    多程序併發伺服器 使用多程序併發伺服器時要考慮以下幾點:             1.      父程序最大檔案描述個數(父程序中需要close關閉accept返回的新檔案描述符)             2.      系統內建立程序個數(與記憶體大小相關)      

    分散式併發IM伺服器從零架構思想 (一)

    寫在前面:我寫本系列部落格的目的是自己打算研發一款基於JAVA的IM伺服器,文章用來記錄自己平時領悟到的一些設計思想,防止到開發的時候遺忘, 如對大家有幫助,同樣歡迎留言探討 (作者 孔令寬  2012年畢業於山科 從事Android原生/混合開發、前端VUE富客戶端開發、

    快速構建MMO伺服器框架(七)併發TCP網路框架

    忙活了一個多星期,差不多把基於TCP的高併發連線網路架構測試穩定了。 目的:利用多執行緒把網路連線及資料包壓縮/解壓、加密/解密等等耗時的操作分流(asio對這些沒有原生的支援),順帶提供執行緒池框架。只對遊戲邏輯層暴露出單執行緒的外觀,隔離底層多執行緒的複雜度。 結構如下圖

    Linux c實現一個tcp文件服務器和客戶端

    repr snippets 功能 stderr strcpy fprintf inet_addr 編寫 create 總體需求:編寫tcp文件服務器和客戶端。客戶端可以上傳和下載文件。 ===========================================

    Linux併發socket最大連線數各種限制的調優

    1、修改使用者程序可開啟檔案數限制  在Linux平臺上,無論編寫客戶端程式還是服務端程式,在進行高併發TCP連線處理時,最高的併發數量都要受到系統對使用者單一程序同時可開啟檔案數量的限制(這是因為系統為每個TCP連線都要建立一個socket控制代碼,每個socket控制代碼同時也是一個檔案控制代碼)。可使用

    併發訂單系統架構設計

    高併發下單主要包括以下幾個方面: 分庫分表 多應用例項全域性唯一訂單號 資料庫連線 買家查詢訂單 賣家查詢訂單 擴容問題 業務拆分 一、分庫分表 隨著訂單量的增長,資料庫的發展主要經歷以下幾個步驟:  - 1主-1從架構  - 雙主-多從架構,讀寫分離  - 表

    大規模叢集下的Hadoop併發以及高效能架構原理總結【石杉的架構筆記】

    歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! “ 又到週末,老規矩,週末不給大家送上“燒腦”的技術文章,我們稍微停一下腳步,總結一下之前的內容,溫故而知新。 前言 這次我們總結的,主要是之前大資料的內容。這裡筆者多說一句,筆者認為

    千萬級規模【高效能、併發】網際網路架構經驗分羹

    架構以及我理解中架構的本質 在開始談我對架構本質的理解之前,先談談對今天技術沙龍主題的個人見解,千萬級規模的網站感覺數量級是非常大的,對這個數量級我們戰略上 要重 視 它 , 戰術上又 要 藐 視 它。先舉個例子感受一下千萬級到底是什麼數量級?現在很流行的優步(Uber),從媒體公佈的資訊看,它每天接單

    千萬級規模【高效能、併發】網際網路架構經驗分享~

    作者:Java關博 連結:http://blog.51cto.com/14049376/2329037?utm_source=tuicool&utm_medium=referral 架構以及我理解中架構的本質 在開始談我對架構本質的理解之前,先談談對今天技術沙龍主題的個人見解,千萬級規模

    提升併發伺服器效能解決思路

      一個小型的網站,可以使用最簡單的html靜態頁面就實現了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統架構、效能的要求都很簡單。隨著網際網路業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說,所採用的技術更是涉及面非常廣,從硬體到軟體

    Linux併發socket最大連線數所受的各種限制

    1、修改使用者程序可開啟檔案數限制在Linux平臺上,無論編寫客戶端程式還是服務端程式,在進行高併發TCP連線處理時,最高的併發數量都要受到系統對使用者單一程序同時可開啟檔案數量的限制(這是因為系統為每個TCP連線都要建立一個socket控制代碼,每個socket控制代碼同時也是一個檔案控制代碼)。可使用ul

    C++併發網路通訊引擎學習記錄。

    2018.11.19 週一 學了 C/C++ 語言這麼久了,從來沒有真正的做過一個完整的專案,總覺得缺了點什麼,所以決定找一個專案來認認真真跟著做。最後在朋友的推薦下選擇了劉向東的《C++百萬併發網路通訊引擎架構與實現》,學習這個專案我大概給自己規劃了3個學習階段: 跟著老師

    併發TCP連線數目問題

    linux可通過五元組唯一確定一個連結:源IP,源埠,目的IP,目的埠,傳輸層協議。而一個埠不允許被兩個及以上程序佔用(一個程序可同時佔用多個埠),據此是否可以推測一臺linux伺服器最多可以同時處理2^16(65536,或65K)個連結即併發請求呢? 一臺伺服器到底能夠支援多少TCP併發連線呢? 1.

    併發訂單系統架構設計(二)

    高併發下單主要包括以下幾個方面: 分庫分表 多應用例項全域性唯一訂單號 資料庫連線 買家查詢訂單 賣家查詢訂單 擴容問題 業務拆分 一、分庫分表 隨著訂單量的增長,資料庫的發展主要經歷以下幾個步驟: - 1主-1從架構 - 雙主-多從架構,讀寫

    【火熱報名】1月19日阿里雲棲開發者沙龍合肥專場:併發企業級應用架構實踐分享

    活動介紹 阿里雲棲開發者沙龍是“雲棲社群”主辦的線下技術沙龍品牌,希望通過技術乾貨分享來打通線上線下專家和開發者的連線。沙龍每期將定位不同的技術方向,逐步覆蓋 雲端計算,大資料,前端,PHP,android,AI,運維,測試 等技術領域,並會穿插一些特別專場(開源專場,女性開發者專場,開發者成長專場等)。我

    併發解決方案——提升併發伺服器效能解決思路

    一個小型的網站,可以使用最簡單的html靜態頁面就實現了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統架構、效能的要求都很簡單。隨著網際網路業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說,所採用的技術更是涉及面非常廣,從硬體到軟體

    新浪微博千萬級規模高效能、併發的網路架構經驗分享

    架構以及我理解中架構的本質 在開始談我對架構本質的理解之前,先談談對今天技術沙龍主題的個人見解,千萬級規模的網站感覺數量級是非常大的,對這個數量級我們戰略上要重視它,戰術上又要藐視它。 先舉個例子感受一下千萬級到底是什麼數量級?現在很流行的優步(Uber),從媒體