首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >new和delete处理多线程问题

new和delete处理多线程问题
EN

Stack Overflow用户
提问于 2011-11-03 07:31:51
回答 3查看 3K关注 0票数 6

我正在读一本关于全局新操作符和删除操作符的高效的C++:性能编程技术作者的书:

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

在第6章.单线程内存池.

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-03 07:38:49

这将取决于执行情况。例如,VisualC++运行库在早期版本中有单线程版本和多线程版本的堆,但从VisualC++ 2005开始,它只有一个多线程版本。这篇MSDN文章有一个很好的汇总表。

当使用多线程堆时,调用内存分配和取消分配是线程安全的,而代价是额外的开销。

票数 7
EN

Stack Overflow用户

发布于 2011-11-03 07:38:43

C++ (C++03标准)不谈论多线程。然而,大多数平台都支持线程安全的new/malloc。这里有一个以前的职位在讨论同样的问题。

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

票数 3
EN

Stack Overflow用户

发布于 2015-04-07 14:45:02

对于C++11 (它有数据竞争的概念),标准保证了new/deletecalloc/malloc/realloc/free将以单一的总顺序发生。

来自n3690 18.6.1.4:

为了确定数据竞赛的存在,操作符的库版本新、全局操作符的用户替换版本、C标准库函数calloc和malloc、操作符删除的库版本、操作符删除的用户替换版本、C标准库函数免费和C标准库函数realloc不应引入数据竞赛(17.6.5.9)。对分配或释放特定存储单元的这些功能的调用应以单个总顺序进行,而每一次此类取消分配调用都应发生在(1.10)此顺序中的下一次分配(如果有的话)之前。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7991490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档