我打算寫一個C++網絡應用程序,其中:跨線程分配好分配器和免費
- 我使用一個單獨的線程來接受TCP連接,並從中讀取數據。我打算使用epoll/select來做到這一點。數據被寫入緩衝區,使用某些競技場分配器,如jemalloc分配。
- 一旦來自單個TCP客戶端的足夠數據形成協議消息,數據就會發布在環形緩衝區中。環形緩衝區結構包含用於連接的fd和指向包含相關數據的緩衝區的指針。
- 工作線程處理來自環形緩衝區的條目並將一些結果數據發送到客戶端。在處理完每個事件後,工作線程釋放實際的數據緩衝區,將其返回給競技場分配器以供再次使用。
我沒有詳細說明發布者如何通過它向工作線程顯示寫入的數據。
所以我的問題是:是否有任何分配器優化這種行爲即在一個線程上分配對象並釋放另一個線程?
我特別擔心必須使用鎖來將內存返回到不是線程關聯競技場的競技場。我也擔心虛假共享,因爲生產者線程和工作線程都會寫入同一個區域。看起來像jemalloc或tcmalloc都沒有爲此優化。
感謝您的回答。你的假設是正確的。我從一開始就開始了所有的話題,他們的號碼從不改變。這似乎是一件好事,嘗試。就像你注意到的,我沒有做任何基準測試。在開始優化任何事情之前,我肯定會這樣做。 – Rajiv
鎖爭用不應該是太多的問題。與處理圖像數據所花費的時間相比,鎖必須保持的時間非常短 - 只需將足夠小的「fd +緩衝區指針」結構體推送到您使用的任何隊列/容器即可。與將它們返回某個池供重新使用一樣。 –
@MartinJames:這個問題本身比提問者的用例具有更廣泛的適用性。我已經警告提問者不要試圖實現這些複雜的事情,除非應用程序被證明需要它。其他人的應用程序可能需要這樣的東西,他們的搜索可能會把他們帶到這裏。 – jxh