首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11内存模型是否防止内存撕裂和冲突?

C++11内存模型是否防止内存撕裂和冲突?
EN

Stack Overflow用户
提问于 2012-06-05 12:13:11
回答 2查看 1.4K关注 0票数 7

阅读C++11 I的一份草案对第1.7.3条感兴趣:

内存位置要么是标量类型的对象,要么是相邻位字段的最大序列,它们都具有非零宽度。..。两个执行线程(1.10)可以更新和访问不同的内存位置,而不相互干扰。

此条款是否保护不受硬件相关的争用条件的影响,例如:

  • 非对齐数据访问,其中内存在两个总线事务(内存撕裂)中更新?
  • ,在系统内存单元中有不同的对象,例如,32位字中的两个16位有符号整数,而每个独立对象的独立更新都需要写入整个内存单元(内存冲突)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 12:39:59

关于第二点,标准保证那里不会有种族。尽管如此,有人告诉我,这种保证不是在当前的编译器中实现的,甚至可能无法在某些体系结构中实现。

关于第一点,如果第二点是有保证的,如果你的程序不包含任何竞赛条件,那么自然的结果就是这也不是比赛条件。也就是说,假设向不同子字位置写入的标准保证是安全的,那么唯一可以具有争用条件的情况是,如果多个线程访问相同的变量(跨单词拆分,或者更有可能是跨缓存行这是有问题的)。

同样,这可能很难,甚至不可能实现。如果您的未对齐数据穿过缓存线,那么几乎不可能保证代码的正确性而不给性能带来巨大的成本。由于这个原因和其他原因,您应该尽量避免未对齐的变量(包括原始性能,对对象的写入涉及到两个缓存行,涉及将多达32个字节写入内存,如果任何其他线程接触到任何缓存行,则还涉及缓存同步的成本.

票数 5
EN

Stack Overflow用户

发布于 2012-06-05 12:38:08

它不能防止内存撕裂,只有当两个线程访问相同的内存位置(但子句仅适用于不同的内存位置)时,才能看到内存撕裂。

根据您的例子,它似乎可以防止内存冲突。实现这一目标的最有可能的方法是,一个不能同时写入32位以下的系统将有32位char,然后两个单独的对象永远无法共享一个“系统内存单元”。(在具有32位char的系统上,两个16位整数可以相邻的唯一方法是作为位字段。)

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

https://stackoverflow.com/questions/10897093

复制
相关文章

相似问题

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