為了降低伺服器的延時,我們可以借助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日 最近有乙個小的要求需要用到批處理,我也不懂批處理,沒辦法只好現學現用。由於我們單位的伺服器有時會由於某種不明原因宕掉,目前宕了一次,雖然不是什麼大問題,因為是集群宕掉一台不影響正常訪問,但是上面對我們的考核就要大打拆扣了,因為管...