我打算编写一个 C++ 网络应用程序,其中:
- 我使用单个线程来接受 TCP 连接并从中读取数据。我打算使用 epoll/select 来做到这一点。数据被写入使用一些竞技场分配器分配的缓冲区,比如jemalloc。
- 一旦来自单个 TCP 客户端的数据足以形成协议消息,数据就会发布在环形缓冲区上。环形缓冲区结构包含连接的 fd 和指向包含相关数据的缓冲区的指针。
- 工作线程处理来自环形缓冲区的条目并将一些结果数据发送到客户端。处理完每个事件后,工作线程释放实际的数据缓冲区,将其返回到 arena 分配器以供重新使用。
我将省略有关发布者如何使其写入的数据对工作线程可见的详细信息。
所以我的问题是:是否有任何分配器针对这种行为进行优化,即在一个线程上分配对象并在另一个线程上释放?
我特别担心必须使用锁将内存返回到不是线程关联竞技场的竞技场。我也担心虚假共享,因为生产者线程和工作线程都会写入同一个区域。似乎 jemalloc 或 tcmalloc 都没有为此进行优化。