muduo庫學習筆記 執行緒安全

2021-10-04 04:45:28 字數 1176 閱讀 9279

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執行緒庫通過維護一...