建立乙個tcpserver(包含eevntloop,acceptor,eventthreadpool),呼叫setthreadnum設立執行緒的數目,然後呼叫start()啟動server。在start()中,執行緒池的建立由函式threadpool_->start(threadinitcallback_)完成;啟動監聽由loop_->runinloop(boost::bind(&acceptor::listen, get_pointer(acceptor_)))完成
threadpool_->start(threadinitcallback_)的實現如下:
void eventloopthreadpool::start(const threadinitcallback& cb)
if (numthreads_ == 0 && cb)
}
eventloopthread中包含乙個thread變數,其建構函式如下:
eventloopthread::eventloopthread(const threadinitcallback& cb)
: loop_(null),
exiting_(false),
thread_(boost::bind(&eventloopthread::threadfunc, this), "eventloopthread"), // fixme: number it
mutex_(),
cond_(mutex_),
callback_(cb)
}
}
void eventloopthread::threadfunc()
可見loop只是乙個棧變數。
loop.loop();
//assert(exiting_);
loop_ = null;
}
loop_->runinloop()主要啟動監聽,這時需要類acceptor型的變數:
void acceptor::listen()
因為acceptor完成的是監控連線的功能,其必然包含兩個變數channel和socket.
acceptchannel主要是用來監聽的channel,其handevent()最終會執行 acceptchannel_.setreadcallback(boost::bind(&acceptor::handleread, this));
acceptor::handleread的實現如下:
void acceptor::handleread()
else
} else
}}
解釋:每當收到乙個連線,就執行一遍handleread(),注意此時仍然在主線程中。接著通過newconnectioncallback_()執行tcpconnection::newconnection(),建立乙個新的連線:
void tcpserver::newconnection(int sockfd, const inetaddress& peeraddr)
此函式,個人認為是整個muduo的精華的所在,即one loop per thread。注意兩句**:
eventloop* ioloop = threadpool_->getnextloop();和
conn->setclosecallback(
boost::bind(&tcpserver::removeconnection, this, _1)); // fixme: unsafe
ioloop->runinloop(boost::bind(&tcpconnection::connectestablished, conn));
這兩句完成了round-robin演算法分發連線,以及對該連線在分發到的執行緒進行收發資料。
開源閱讀 開源如何維持您的閱讀習慣
開源閱讀 經常閱讀有關技術的資訊可以幫助您建立事業。我最近分享,在情人 節 我該怎麼讀 什麼有些人會說是 的書太多了。我曾經有乙個硬拷貝圖書館,實際上在我丈夫搬進來之前我的房子已經占用了我的兩個房間。他尊重地要求為人們提供空間,並且我考慮了向數位化的轉變。我仍然需要占用大量空間,但是現在僅限於電子閱...
開源軟體閱讀技巧心得
知其然,更要知其所以然 開源軟體 所以然 風格 每一種語言 每乙個社群 每乙個開發者群體,甚至每乙個開源專案,都有其獨特的 風格,這種風格,有其背後的合理性,也有很多是 於某種開發哲學的思考。理解一種 風格,就是理解一種思考的模式,一種思想的體系。能夠多了解一些不同種類的 風格,對於提高軟體開發能力...
如何閱讀linux c開源專案呢?
如何閱讀linux c開源專案呢?1.先baidu知道這個玩意是做什麼用的 對這個軟體產品的功能有了解 2.看官方文件關於架構設計的思考,或者總結的架構框架 對 的框架有了解 3.看這個軟體的一些設計細節,比如怎麼模組化劃分,主要用到什麼資料結構和演算法,這時候可以試著編譯執行 看configure...