x
以下C ++代码片段中的变量可能产生的最终结果是什么?(请根据C ++标准允许的内容而不是当前在不同平台上可用的内容回答)
// Inside Thread 0
std::atomic<int> x = {2};
// Inside Thread 1
x.fetch_sub(1,std::memory_order_relaxed)
// Inside Thread 2
x.fetch_sub(1,std::memory_order_relaxed)
理想情况下,我希望x
最后为零。即使我正在使用,情况还是这样std::memory_order_relaxed
吗?
编辑:为了使问题更精确,是否保证1)在线程1和2中的返回值为0或1,以及2)在线程1和2中的返回值是不同的。
简短的回答:是的。
长答案:std::memory_order_relaxed
被描述为:
宽松的操作:没有对其他读取或写入施加同步或排序约束,仅保证此操作的原子性。
这实际上意味着仅保证原子性。这意味着该std::atomic::fetch_sub
操作将仅保证原子的读取-修改-写入操作,而不会对其他操作进行任何排序。但是,这并不意味着编译器可以对两个不同的原子读取,修改和写入操作进行重新排序(这可能导致数据争用,这是未定义的行为)。它们仍然是原子的。
理想情况下,我希望
x
最后为零。即使我正在使用,情况还是这样std::memory_order_relaxed
吗?
在这种情况下,内存顺序无关紧要。它们都不会干扰原子性的基本保证。您所做的上述声明将对任何内存顺序均成立,因为根据定义,该声明对于以这种方式修改过的原子变量(从的初始值减去两次,可能是异步的2
)都成立。
为了使问题更精确,是否保证1)在两个线程中的返回值都是
0
或1
,以及2)在Threads1
和2
中的返回值是不同的。
是的,是的,假设线程返回在callx
之后保存的值fetch_sub
,这从技术上讲可能是错误的(线程不返回值),但是我知道您从这里来了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句