利用執行緒本地儲存降低伺服器處理延時

2021-07-09 21:17:56 字數 1723 閱讀 7816

為了降低伺服器的延時,我們可以借助threadlocal,在每乙個sub reactor所屬的執行緒中建立乙個用於儲存連線物件的資料結構,有連線請求到來時,將其插入當前處理連線的執行緒本地連線佇列中。這樣再有**業務需要處理的時候,所有執行緒可以併發的執行**業務,並且不需要使用鎖,大大降低了伺服器的延遲時間。kimgbo網路庫中直接採用了muduo對於threadlocal的封裝,可以利用kimgbo網路庫方便的實現此功能。經過改進後的程式,所有的sub reactor執行緒中都儲存了乙份連線佇列,隨時可以執行訊息**工作,而main reactor所在的主線程還需要負責排程、分發每個sub reactor在不同時刻的行為。示意圖如下:

當然,主線程中也會存在一塊執行緒私有資料。專案全部的**參見kimgbo網路庫example/chat目錄下,核心的實現**如下:

#include #include #include #include #include "logging.h"

#include "mutex.h"

#include "eventloop.h"

#include "tcpserver.h"

#include "codec.h"

#include "threadlocalsingleton.h"

using namespace kimgbo;

using namespace kimgbo::net;

class chatserver

void setthreadnum(int numthreads)

void start()

private:

typedef std::setconnectionlist;

void onconnection(const tcpconnectionptr& conn)

else

} /*初始化執行緒之前*/

void threadinit(eventloop* loop)

/*業務排程分發*/

void onstringmessage(const tcpconnectionptr&, const kimgbo::string& message, timestamp)

log_debug;

} /*各個執行緒具體的訊息**處理函式*/

void distributemessage(const kimgbo::string& message)

log_debug << "end";

} private:

eventloop* m_loop;

tcpserver m_server;

lengthheadercodec m_codec;

mutexlock m_mutex;

threadlocalsingletonm_connections; //定義執行緒本地儲存資料

std::setm_loops; //儲存各個執行緒的事件迴圈物件,方便排程

};int main(int argc, char* argv)

server.start();

loop.loop();

} else

}

kimgbo開源網路i/o庫見:

瀏覽器本地儲存與伺服器端儲存之間的區別

資料既可以在瀏覽器本地儲存,也可以在伺服器端儲存。瀏覽器端可以儲存一些資料,需要的時候直接從本地獲取,sessionstorage localstorage和cookie都由瀏覽器儲存在本地的資料。伺服器端也可以儲存所有使用者的所有資料,但需要的時候瀏覽器要向伺服器請求資料。1.伺服器端可以儲存使用...

本地伺服器 利用openssl生成證書

二 1.在當前bin目錄,按住shift鍵右擊,選擇 在此處開啟命令視窗 2.開啟cmd命令視窗之後,在視窗中輸入 openssl 命令,進入openssl 區 三 生成rsa私鑰 無加密 設定server.key genrsa des3 out server.key 1024 四 引數設定 req...

利用批處理檢查伺服器宕機,批處理檢查伺服器端口

利用批處理檢查伺服器宕機,批處理檢查伺服器端口 2010年07月06日 最近有乙個小的要求需要用到批處理,我也不懂批處理,沒辦法只好現學現用。由於我們單位的伺服器有時會由於某種不明原因宕掉,目前宕了一次,雖然不是什麼大問題,因為是集群宕掉一台不影響正常訪問,但是上面對我們的考核就要大打拆扣了,因為管...