gpt4 book ai didi

c++ - 用于跨线程分配和免费的良好分配器

转载 作者:太空狗 更新时间:2023-10-29 20:26:37 24 4
gpt4 key购买 nike

我打算编写一个 C++ 网络应用程序,其中:

  1. 我使用单线程接受 TCP 连接并从中读取数据。我打算使用 epoll/select 来做到这一点。数据被写入使用一些竞技场分配器(例如 jemalloc)分配的缓冲区。
  2. 一旦来自单个 TCP 客户端的数据足以形成协议(protocol)消息,数据就会发布到环形缓冲区中。环形缓冲区结构包含连接的 fd 和指向包含相关数据的缓冲区的指针。
  3. 工作线程处理来自环形缓冲区的条目并将一些结果数据发送到客户端。处理每个事件后,工作线程释放实际数据缓冲区,将其返回给竞技场分配器以供重新使用。

我省略了有关发布者如何使它写入的数据对工作线程可见的详细信息。

所以我的问题是:是否有任何分配器可以优化这种行为,即在一个线程上分配对象并在另一个线程上释放?

我特别担心必须使用锁将内存返回到不是线程亲和区域的区域。我还担心错误共享,因为生产者线程和工作线程都将写入同一区域。似乎 jemalloc 或 tcmalloc 都没有为此进行优化。

最佳答案

在为多线程应用程序实现高度优化的分配器之前,您应该首先使用标准的 newdelete 操作符来实现.正确实现应用程序后,您可以着手解决通过分析发现的瓶颈。

如果您到了很明显标准 newdelete 分配器是应用程序瓶颈的阶段,以下是我使用的方法:

假设:线程数量是固定的,是静态创建的。

  • 每个线程都有自己的竞技场。
  • 从竞技场中取出的每个对象都有一个指向它来自的竞技场的引用。
  • 每个竞技场的每个线程都有一个单独的垃圾列表。
  • 当一个线程释放一个对象时,它会回到它来自的区域,但会被放置在线程特定的垃圾列表中。
  • 实际拥有竞技场的线程将其垃圾列表视为真正的空闲列表。
  • 周期性地,拥有 arena 的线程执行垃圾收集过程,将其他线程垃圾列表中的对象折叠到真正的空闲列表中。

“周期性”垃圾收集过程不一定是基于时间的。例如,可以在每次分配时回收并释放一部分垃圾。

关于c++ - 用于跨线程分配和免费的良好分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19147970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com