1
1
我刚刚重新阅读了这个问题,添加了一些额外的说明,并意识到我假设了c11,而您的问题似乎是使用编译器内置的。从这个角度来看,如果你
TL;医生:这要看情况,但你必须真的开枪打自己的脚,才能保证这种行为。下面解释为什么 能够 发生了, 怎样 这可能会发生,为什么你不太可能遇到这种情况。 原子操作保证具有全局顺序,但未定义全局总顺序。根据C11草案,§5.1.2.4P7:
根据这种修改的定义 米 其他线程观察到的总顺序是A/B,但也允许B/A。这实际上会产生外部观察者注意到值在-1和0之间转换的效果(假设是有符号的原子类型)。 为了解决这个问题,标准定义了 同步操作 (同一节第5段):
稍后,阅读这些操作如何组合以引入最终产生“先于发生”排序的依赖项的定义会有些乏味。我将省略这些;§5.1.2.4p14-22描述对某些对象的副作用的可观察性以及依赖如何影响这些副作用;§7.17.3描述控制这些依赖的api。
如果不讨论这些部分,希望这些部分足以说明,它们确实允许观察者看到所描述的“相反顺序”。当你使用
这不太可能是你真正会做的。首先,这是更多的打字。其次,api的命名和使用实际上表明,如果你想使用它,你应该知道你在做什么。这就是我的意思,你真的要开枪打自己的脚:你不愿意做这种事。
如果你完全用
标准保证这个顺序将携带数据依赖关系,这样从线程A的写入被认为“发生在”从线程B的写入之前。因此,一个观察器C,其自身的一致的内存顺序要求,被保证看到操作以顺序D交错按预期描述。
上面都说:如果你能用C11,就用
|
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |