- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
众所周知,自 C++11 以来,有 6 个内存顺序,在有关 std::memory_order_acquire
的文档中:
memory_order_acquire
A load operation with this memory order performs the acquire operation on the affected memory location: no memory accesses in the current thread can be reordered before this load. This ensures that all writes in other threads that release the same atomic variable are visible in the current thread.
<强>1。非atomic-load可以在atomic-acquire-load之后重新排序:
即不保证在acquire-atomic-load之后不能重新排序non-atomic-load。
static std::atomic<int> X;
static int L;
...
void thread_func()
{
int local1 = L; // load(L)-load(X) - can be reordered with X ?
int x_local = X.load(std::memory_order_acquire); // load(X)
int local2 = L; // load(X)-load(L) - can't be reordered with X
}
加载 int local1 = L;
可以在 X.load(std::memory_order_acquire);
之后重新排序吗?
<强>2。我们可以认为非atomic-load在atomic-acquire-load之后是不能重新排序的:
一些文章包含一张图片,展示了获取-释放语义的本质。这很容易理解,但会引起混淆。
例如,我们可能认为std::memory_order_acquire
不能对任何一系列的Load-Load操作进行重新排序,即使是非atomic-load也不能在atomic-acquire-load之后进行重新排序.
<强>3。非atomic-load可以在atomic-acquire-load之后重新排序:
澄清的好事:获取语义可防止读取-获取的内存重新排序,任何读取或写入操作按程序顺序紧随其后。 http://preshing.com/20120913/acquire-and-release-semantics/
还有known, that :在强排序系统(x86、SPARC TSO、IBM 大型机)上,release-acquire 排序对于大多数操作是自动的。
第 34 页的 Herb Sutter 显示:https://onedrive.live.com/view.aspx?resid=4E86B0CF20EF15AD!24884&app=WordPdf&authkey=!AMtj_EflYn2507c
<强>4。 IE。同样,我们可以认为非atomic-load不能在atomic-acquire-load之后重新排序:
即对于 x86:
那么在 C++11 中非原子加载是否可以在原子获取加载之后重新排序?
最佳答案
我相信这是在 C++ 标准中推理您的示例的正确方法:
X.load(std::memory_order_acquire)
(我们称之为“操作 (A)
”)可能与 X< 上的某个释放操作同步
(操作 (R)
)- 粗略地说,将值分配给 (A)
正在读取的 X
的操作。<[atomics.order]/2 An atomic operation
A
that performs a release operation on an atomic objectM
synchronizes with an atomic operationB
that performs an acquire operation onM
and takes its value from any side effect in the release sequence headed byA
.
这种同步关系可能有助于在 L
的某些修改和赋值 local2 = L
之间建立 happens-before 关系。如果 L
的修改发生在 (R)
之前,那么,由于 (R)
与 ( A)
和 (A)
在 L
的读取之前排序,L
的修改发生在这次读取之前L
.
但是 (A)
对赋值 local1 = L
没有任何影响。它既不会导致涉及此分配的数据竞争,也不会帮助防止它们。如果程序是无竞争的,那么它必须采用一些其他机制来确保 L
的修改与这次读取同步(如果它不是无竞争的,那么它会表现出未定义的行为和标准对此没有进一步说明)。
在C++标准的四个角落里谈论“指令重排序”是没有意义的。人们可能会谈论由特定编译器生成的机器指令,或者这些指令由特定 CPU 执行的方式。但从标准的角度来看,这些只是无关紧要的实现细节,只要编译器和 CPU 产生可观察到的行为与标准 (the As-If rule) 描述的抽象机的一种可能执行路径一致即可。
关于c++ - 非原子负载可以在原子获取负载之后重新排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677061/
我的代码有问题。它总是忽略if(userDigit=1).. 谁能告诉我这里出了什么问题? for(i=0; i=1) { //
我正在尝试从字符串 html_doc 中提取 id=obj1 并尝试将 onclick 函数 附加到它 document.addEventListener("DOMContentLoaded", fu
我正在尝试使用 css 动画来动画化从一个类到另一个类的变化。基本思想是在用户单击按钮时为从一个边缘滑动到另一个边缘的 slider 设置动画。 到目前为止我的代码。 https://jsfiddle
我目前面临使用前后伪元素淡入导航项的问题。 当我悬停导航项时,它必须将其背景颜色从白色更改为蓝色。没什么疯狂的。但它也必须显示两个背景图像,分别通过将::before 伪元素从 0 更改为 1 和::
有没有简单的方法可以在最近的sqlite版本中修改表,使其与预定义的架构匹配? 架构: war_id INTEGER NOT NULL, clanname VARCHAR(64), clanhomep
我该如何将我的搜索结果变成这样的: http://i.stack.imgur.com/NfPGs.png 结果显示特定术语在单元格中的位置。 我目前有这个基本的搜索脚本: $terms =
我正在尝试使用按钮创建输入字段。但我想要的是,当创建输入字段时,我想用相同的按钮隐藏创建的输入字段。我尝试了 slideToggle 函数,但效果不是很好。 $('#addEmail').one('
我想做这样的事情: Reference of image. 我所做的:两个 UIImagesView,一个带有 UIViewContentModeLeft,另一个带有 UIViewContentMod
我在使用应该修复表中列的插入触发器时遇到了问题: id - auto increment int thread_id - int [NULL] 我想要实现的是将 thread_id 设置
我使用 tinter.after() 每 200 毫秒 刷新一次树莓派上模拟时钟的显示。一开始还可以,但逐渐地,每次刷新之间的时间达到大约 2-3 秒。是否有任何解决方案可以将刷新间隔保持在 200m
我有一个按钮,它使用::after 伪来填充背景。目前它从左到右填充,这在宽度从 0 到 100% 时有意义。但是,我希望它翻转它填充的方式。 a.project--link { margin:
我正在尝试添加带有伪元素:after的下划线来注释一些文本。 我的问题是,我想强调下划线。在此示例中,这是短语“实际上确实可以...”和“ ...不起作用”。 .test { margin-top
鉴于此: This is a test It is 有没有我可以应用到 的 CSS?那它会出现在“This is...”之前,并且在 PREVIOUS LINE 之前吗? float:left; d
我正在使用链接左侧的图像。 现在,我使用图像的::before 属性来显示,但它显示在链接的上方。 我需要对齐它。这是一张照片: Link 我使用的代码是: .vocabulary-duration
我有一个页脚有 与 6 body {background:#bbb;} .main-footer a::after { content: " | "; color: white; mar
我有一个父元素和一些子元素,但我不能直接更改它们的 CSS。所以,我试图在父元素的 CSS 中更改我 child 的 CSS。示例: .parent { & .child {
我可以 div:after { content: "hello" } 但我能否为 hello 文本添加标题,以便当我用鼠标悬停它时显示标题? 谢谢 最佳答案 你不需要伪元素: p { ba
CSS 2.1 :after 和 CSS 3 ::after 伪选择器(除了 ::after 旧浏览器不支持)?是否有任何实际理由使用更新的规范? 最佳答案 这是伪类与伪元素的区别。 除了 ::fir
「掏出钥匙开门,然后在黑暗中摸索着墙壁开关的位置,最后将室内的灯点亮。」 这是一个星期之前,我每天晚上下班回家时的固定戏码,也可能是大部分人每天回家时的经历。这种「一对一」的日常琐碎还有许多许
我正在尝试包装 , ,和具有 的元素修复我无法直接编辑的表单上的某些定位。由于某种原因,当我尝试使用以下代码时: $("label").before(""); $("input[type=tex
我是一名优秀的程序员,十分优秀!