我正在读一本书Efficient C++: Performance Programming Techniques作者对全球新的和删除操作符的说法如下:
第6章单线程内存池。他们在流程上下文中管理内存,因为流程可以 产生多个线程,
new()
和delete()
必须能够运行 多线程环境。另外,内存请求的大小 可能因请求而异。
这是真的吗?我认为C ++没有多线程环境的概念,程序员需要处理的是使用一些互斥方式。
答案 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/delete
,calloc/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)下一次分配(如果有的话)之前发生。
我在标准的早期版本中找不到任何此类保证,但(正如其他人所说)我相信大多数实现都为内存分配提供了多线程支持。