次のような C++ ネットワーク アプリケーションを作成する予定です。
- 私は単一のスレッドを使用して、TCP 接続を受け入れ、それらからデータを読み取ります。これを行うために epoll/select を使用する予定です。データは、jemalloc などのアリーナ アロケータを使用して割り当てられたバッファに書き込まれます。
- プロトコル メッセージを形成するのに十分なデータが 1 つの TCP クライアントから得られると、データはリング バッファにパブリッシュされます。リング バッファ構造には、接続用の fd と、関連データを含むバッファへのポインタが含まれます。
- ワーカー スレッドは、リング バッファーからのエントリを処理し、結果データをクライアントに送信します。各イベントを処理した後、ワーカー スレッドは実際のデータ バッファーを解放して、再利用できるようにアリーナ アロケーターに返します。
パブリッシャーが、それによって書き込まれたデータをワーカー スレッドから見えるようにする方法の詳細は省きます。
したがって、私の質問は次のとおりです。この種の動作、つまりオブジェクトをあるスレッドに割り当て、別のスレッドで解放することを最適化するアロケーターはありますか?
スレッド アフィニティ化されたアリーナではないアリーナにメモリを返すためにロックを使用する必要があることを特に心配しています。また、プロデューサー スレッドとワーカー スレッドの両方が同じリージョンに書き込むため、偽共有も心配です。jemalloc または tcmalloc はどちらもこれを最適化していないようです。