gpt4 book ai didi

c++ - C++11 内存模型是否可以防止内存撕裂和冲突?

转载 作者:可可西里 更新时间:2023-11-01 18:36:09 24 4
gpt4 key购买 nike

阅读 C++11 的草稿,我对第 1.7.3 条感兴趣:

A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having non-zero width. ... Two threads of execution (1.10) can update and access separate memory locations without interfering with each other.

此条款是否可以防止与硬件相关的竞争条件,例如:

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

最佳答案

关于第二点,标准保证那里不会有比赛。话虽这么说,但有人告诉我,这种保证在当前的编译器中并未实现,甚至可能无法在某些体系结构中实现。

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

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

关于c++ - C++11 内存模型是否可以防止内存撕裂和冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10897093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com