多线程堆管理

dor*_*ron 11 memory heap operating-system

在C/C++中,我可以在一个线程中分配内存并在另一个线程中删除它.然而,每当从堆请求内存时,堆分配器需要遍历堆以找到适当大小的空闲区域.两个线程如何在不破坏堆的情况下有效地访问同一个堆?(这是通过锁定堆来完成的吗?)

Eme*_*ger 10

通常,您不必担心内存分配器的线程安全性.所有标准内存分配器 - 即MacOS,Windows,Linux等附带的内存分配器 - 都是线程安全的.锁是提供线程安全的标准方法,尽管可以编写仅使用原子操作而不是锁的内存分配器.

现在,这些内存分配器是否可扩展是一个完全不同的问题; 也就是说,它们的性能是否与执行内存操作的线程数无关?在大多数情况下,答案是否定的; 他们要么放慢或会消耗大量的内存.两个维度(速度和空间)中的第一个可扩展分配器是Hoard(我写的); Mac OS X分配器的灵感来自它 - 并在文档中引用它 - 但是Hoard更快.还有其他人,包括谷歌的tcmalloc.