new和delete处理多线程问题

时间:2011-11-03 07:31:51

标签: c++ multithreading new-operator

我正在读一本书Efficient C++: Performance Programming Techniques作者对全球新的和删除操作符的说法如下:

  

他们在流程上下文中管理内存,因为流程可以   产生多个线程,new()delete()必须能够运行   多线程环境。另外,内存请求的大小   可能因请求而异。

第6章单线程内存池

这是真的吗?我认为C ++没有多线程环境的概念,程序员需要处理的是使用一些互斥方式。

3 个答案:

答案 0 :(得分:7)

这将取决于实施。例如,Visual C ++运行时在早期版本中同时具有单线程和多线程版本的堆,但从Visual C ++ 2005开始它只有一个多线程版本。 This MSDN article有一个很好的汇总表。

当使用多线程堆时,对内存分配和释放的调用是线程安全的,但需要额外的开销。

答案 1 :(得分:3)

C ++(C ++ 03标准)没有谈到多线程。但是,大多数平台都支持线程安全的new/malloc。这是previous post讨论同一类问题。

在C ++ 11中,引入了线程。

答案 2 :(得分:0)

从C ++ 11开始(具有数据竞争的概念),该标准保证new/deletecalloc/malloc/realloc/free将在一个总订单中出现。

从n3690 18.6.1.4:

  

为了确定数据竞争的存在,operator new的库版本,用户替换   全局operator new的版本,C标准库函数calloc和malloc,即库   operator delete的版本,operator delete的用户替换版本,C标准库函数   free,C标准库函数realloc不应引入数据竞争(17.6.5.9)。打电话给   分配或取消分配特定存储单元的这些功能应以单个总顺序发生,并且   每次这样的解除分配调用都应该在(1.10)下一次分配(如果有的话)之前发生。

我在标准的早期版本中找不到任何此类保证,但(正如其他人所说)我相信大多数实现都为内存分配提供了多线程支持。