malloc /新锁和多线程

Jak*_* M. 2 c++ multithreading openmp

我应该如何new 在多线程环境中使用?

确切地说:我有一段代码,我用40个线程运行.每个线程调用new几次.我注意到性能下降,可能是因为线程锁定new(花费大量时间__lll_lock_wait_parallel__lll_unlock_wait_parallel).什么是new/ delete我可以使用的最佳替代品?

有关:

Wil*_*ill 6

即使您使用的是new运算符,它也可以使用malloc下面的方法来进行分配和释放.重点应放在分配器上,而不是在这些情况下用于达到它的API.

TCMalloc是在Google创建的malloc,专门用于在多线程环境中获得良好性能.它是google-perf-tools的一部分.

你可能会看到的另一个malloc是Hoard.它与TCMalloc有很多相同的目标.


cni*_*tar 5

我不知道"最好的",但我会尝试一些事情:

  • 减少分配/释放的频率(可能很难).如果它提高了性能,就浪费内存(但不要泄漏)

  • 滚动我自己的每线程分配器,并始终使用相同的线程分配/释放mmap 实际内存

要滚动自己的原始分配器:

  • 用于mmap从操作系统获取大量内存
  • 使用数据结构(链表,树等)来跟踪空闲和已使用的块
  • 永远不要释放其他线程分配的数据

我不认为这是微不足道的,但如果做得好,它可以提高性能.最毛茸茸的部分是到目前为止跟踪分配,防止碎片等.

在本书末尾的" C编程语言 "中提供了一个简单的实现(但它使用了brkIIRC).