我正在读一本关于全局新操作符和删除操作符的高效的C++:性能编程技术作者的书:
它们管理进程上下文中的内存,而且由于进程可能产生多个线程,所以
new()和delete()必须能够在多线程环境中操作。此外,内存请求的大小可能因请求而异。
在第6章.单线程内存池.
这是真的吗?我认为C++没有多线程环境的概念,程序员需要通过一些互斥的方法来处理。
发布于 2011-11-03 07:38:49
这将取决于执行情况。例如,VisualC++运行库在早期版本中有单线程版本和多线程版本的堆,但从VisualC++ 2005开始,它只有一个多线程版本。这篇MSDN文章有一个很好的汇总表。
当使用多线程堆时,调用内存分配和取消分配是线程安全的,而代价是额外的开销。
发布于 2011-11-03 07:38:43
C++ (C++03标准)不谈论多线程。然而,大多数平台都支持线程安全的new/malloc。这里有一个以前的职位在讨论同样的问题。
在C++11中,引入了线程。
发布于 2015-04-07 14:45:02
对于C++11 (它有数据竞争的概念),标准保证了new/delete、calloc/malloc/realloc/free将以单一的总顺序发生。
来自n3690 18.6.1.4:
为了确定数据竞赛的存在,操作符的库版本新、全局操作符的用户替换版本、C标准库函数calloc和malloc、操作符删除的库版本、操作符删除的用户替换版本、C标准库函数免费和C标准库函数realloc不应引入数据竞赛(17.6.5.9)。对分配或释放特定存储单元的这些功能的调用应以单个总顺序进行,而每一次此类取消分配调用都应发生在(1.10)此顺序中的下一次分配(如果有的话)之前。
在标准的早期版本中,我找不到任何这样的保证,但是(就像其他人说的那样),我相信大多数实现都为内存分配提供多线程支持。
https://stackoverflow.com/questions/7991490
复制相似问题