【问题标题】:new and delete handles multithreading issuesnew 和 delete 处理多线程问题
【发布时间】:2025-12-07 09:45:01
【问题描述】:

我正在阅读一本书 Efficient C++: Performance Programming Techniques 作者对全局 new 和 delete 运算符的看法如下:

它们在进程上下文中管理内存,并且由于进程可能 产生多个线程,new()delete() 必须能够在 多线程环境。另外,内存请求的大小 可能因一个请求而异。

第 6 章。单线程内存池

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

【问题讨论】:

  • 你的问题呢?这将如何实施?
  • @*foe Book 进一步提供了单线程和多线程支持的内存分配实现,但是当我尝试他的第一种方法时,它在 Visual Studio 编译器上失败了,所以我有疑问。

标签: c++ multithreading new-operator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    C++(C++03 标准)不讨论多线程。但是大多数平台都支持线程安全的new/malloc。这是previous post 讨论相同类型的问题。

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

    【讨论】:

    • 标准与实际应用的区别+1。 C 和 C++ 的多线程技术由来已久。
    【解决方案3】:

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

    从 n3690 18.6.1.4:

    为了确定是否存在数据竞争,operator new、user replacement 的库版本 全局运算符 new 的版本,C 标准库函数 calloc 和 malloc,库 operator delete 的版本,operator delete 的用户替换版本,C 标准库函数 免费,并且 C 标准库函数 realloc 不应引入数据竞争 (17.6.5.9)。来电 这些分配或取消分配特定存储单元的功能应以单个总顺序发生,并且 每个这样的释放调用都应在 (1.10) 之前按此顺序进行下一次分配(如果有)。

    我在以前版本的标准中找不到任何这样的保证,但是(就像其他人所说的那样)我相信大多数实现都为内存分配提供了多线程支持。

    【讨论】: