![]() |
1
9
C++11原子处理 三 问题:
当您使用
实现“应该”(即鼓励)在合理的时间内使内存写入可见,即使使用宽松的排序。这是可以说的最好的;这些东西迟早会出现的。 因此,是的,从形式上讲,一个从未使轻松的写入对轻松的读取可见的实现符合语言定义。在实践中,这种情况不会发生。
至于什么
|
![]() |
2
4
这在技术上是合法的
参考文献: http://www.developerfusion.com/article/138018/memory-ordering-for-atomic-operations-in-c0x/ “唯一的要求是,从同一线程对单个原子变量的访问不能重新排序:一旦给定线程看到了原子变量的特定值,该线程随后的读取就无法检索该变量的早期值。” |
![]() |
3
4
如果处理器没有缓存一致性协议,或者协议非常简单,那么它可以“优化”从缓存中获取过时数据的负载。现在大多数现代多核CPU都实现了缓存一致性协议。然而,A9之前的ARM没有。非CPU架构也可能没有缓存一致性(尽管它们可能不符合C++内存模型)。 另一个问题是许多体系结构(包括ARM和x86)允许重新排序内存访问。我不知道处理器是否足够聪明,能够注意到对同一地址的重复访问,但我对此表示怀疑(在极少数情况下,这会花费空间和时间,因为编译器应该能够注意到这一点,但好处很小,因为以后的访问很可能是L1命中),但从技术上讲,它可以推测会进行分支,并且可以在第一次访问之前重新排序第二次访问(不太可能,但如果我正确阅读了英特尔和ARM手册,这是允许的)。
最后,还有一些外部设备不遵守高速缓存一致性。如果CPU通过内存映射IO/DMA进行通信,则页面必须标记为不可缓存(否则,L1/L2/L3/…缓存中的数据将过时)。在这种情况下,处理器通常不会重新排序读写(有关详细信息,请参阅处理器手册-它可能有更细粒度的控制)-编译器可以,因此您需要使用
恐怕我无法回答这样强大的缓存一致性是否会在未来的处理器中可用。我建议严格遵守规范(“在int中存储指针有什么问题?肯定没有人会使用超过4GiB的用户,所以32b地址就足够大了。”)。其他人回答了正确性,所以我不包括它。 |
![]() |
4
1
这是我的看法,尽管我对这个话题没有太多知识,但还是要谨慎对待。
这个
直接的含义是,任何访问
事实上,你问的问题是,如果
我认为答案是CPU 不能 假设一个存储单元从上次读取时起没有改变。即使在单核系统上,内存访问也不是严格留给CPU的。许多其他子系统可以以读写方式访问它(这是其背后的原理 DMA ).
CPU可能能做的最安全的优化是检查缓存中的值是否发生了变化,并将其用作
|
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 2 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 6 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 6 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 6 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 6 年前 |