muduo規定的必須在io執行緒完成的操作:
連線的更新
連線的讀寫
連線的關閉
連線的析構等
tcpserver::start():將acceptor::listen置於所屬執行緒?
一直不理解為什麼這裡需要將listen放到其所屬執行緒中(因為listen的描述符一定是在io執行緒中的)可能原因是其他從reactor執行緒中可能會建立監聽描述符
tcpserver::newconnection():將tcpconnection::connectestablished置於所屬執行緒
這是肯定的,因為connectestablished函式涉及連線的更新操作,這個函式應該由其連線所屬的執行緒來呼叫,而此時的函式是監聽fd所屬的執行緒所以需要採取此操作。
tcpserver::removeconnection:將removeconnectioninloop置於所屬執行緒
為了避免在刪除map中的conn物件時出現競爭,muduo規定只能在map(也就是監聽fd)所屬的執行緒中進行刪除操作,從而避免了多個執行緒使用map而造成的競爭。
tcpserver::removeconnectioninloop:將tcpconnection::connectdestroyed置於queueinloop
此操作根本是保證channel不會在tcpconnection物件析構後而析構,因為handleread等操作是由channel直接呼叫的,但是此函式可能會直接將channel析構呼叫從而出現段錯誤,所以採用此操作使得channel的析構推遲。
tcpconnection::send:將tcpconnection::sendinloop置於所屬執行緒
因為執行緒池的執行緒可能會採用send操作
tcpconnection::shutdown將tcpconnection::shutdowninloop置於所屬執行緒
因為執行緒池中的執行緒可能會採用shutdown操作
tcpserver::~tcpserver將tcpconnection::connectiondestroy置於所屬執行緒
因為tcpserver在析構時需要關閉所有的連線,而析構函式是在監聽fd所屬的io執行緒的,所有要採取此操作。
tcpconnection::forceclose將tcpconnection::forcecloseinloop置於所屬執行緒
因為執行緒池中的執行緒可能會採用forceclose操作
linux多執行緒網路庫 muduo庫學習
什麼是muduo庫 muduo 是基於 reactor 模式 執行緒安全的 支援多核多執行緒的簡單易用的網路庫。符合現代c 程式設計規範 大量使用boost的開源網路庫。為什麼學習muduo庫 muduo庫對學習linux下面向過程c 程式設計 多執行緒程式設計 boost庫應用實踐,有非常大的幫助...
muduo網路庫學習筆記 5 執行緒池的實現
生產者 消費者問題也被稱為有界緩衝區問題,兩個程序 執行緒共享乙個公共的固定大小的緩衝區。其中乙個是生產者,將資訊放入緩衝區 另乙個是消費者,從緩衝區中取出資訊。問題在於當緩衝區已滿,而此時生產者還想向其中放入乙個新的資料項的情況。其解決方法就是讓生產者休眠,待消費者從緩衝區中取出乙個或多個資料項時...
muduo網路庫學習筆記 7 執行緒特定資料
1 了解執行緒特定資料 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問。posix執行緒庫通過維護一...