我打算编写一个C ++联网应用程序,其中:
我遗漏了有关发布者如何将其编写的数据显示给工作线程的详细信息。
所以我的问题是:是否有任何分配器可以优化这种行为,即在一个线程上分配对象并在另一个线程上释放?
我特别担心必须使用锁来将内存返回到一个不是线程关联竞技场的竞技场。我也担心错误共享,因为生产者线程和工作线程都将写入同一区域。看起来像jemalloc或tcmalloc都没有针对此进行优化。
答案 0 :(得分:3)
在为多线程应用程序实现高度优化的分配器之前,首先应该使用标准new
和delete
运算符来实现。在正确实现应用程序之后,您可以解决通过分析它发现的瓶颈问题。
如果您进入显然标准new
和delete
分配器是应用程序瓶颈的阶段,以下是我使用的方法:
假设:线程数是固定的,并且是静态创建的。
“定期”垃圾收集通行证不一定必须基于时间。例如,垃圾的一部分可以在每次分配时获得并且是免费的。
答案 1 :(得分:3)
处理内存分配和释放问题的最佳方法是不处理它。
你提到了一个环形缓冲区。这些通常是固定的大小。如果您可以为协议消息提供固定的最大大小,则可以分配程序启动时所需的所有内存。取消分配时,请保留内存,但将其重置为新状态。
现在,您的程序可能需要在处理每条消息时分配和释放内存,但这将在每个线程中完成,并且跨线程问题将无法发挥作用。
即使您的消息最大大小太大而无法预分配,如果您可以分配大多数消息将使用的内存量并且在必要时分配更多处理程序,这也可以正常工作。