单个变量的原子运算

古沙

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)在两个线程中的返回值都是01,以及2)在Threads12的返回值是不同的。

是的,是的,假设线程返回在callx之后保存的值fetch_sub,这从技术上讲可能是错误的(线程返回值),但是我知道您从这里来了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是对 ExecuteNonQuery() 原子的单个调用

来自分类常见问题

Swift变量是原子的吗?

来自分类Dev

原子地读取非原子变量?

来自分类Dev

增量运算符的原子性

来自分类Dev

增量运算符的原子性

来自分类Dev

原子中的SQL LIKE运算符

来自分类Dev

原子比较运算符(无交换)

来自分类Dev

简单赋值运算符的原子性

来自分类Dev

Speeglm $运算符对原子向量无效

来自分类Dev

在C ++中对普通整数使用原子运算

来自分类Dev

原子比较运算符(无交换)

来自分类Dev

线程内原子变量的使用

来自分类Dev

布尔变量的原子增量(CUDA)

来自分类Dev

是对单个文档原子进行mongo更新($ set)

来自分类Dev

具有非原子变量的C ++ 11原子存储顺序

来自分类Dev

对原子变量进行非原子操作,反之亦然

来自分类Dev

初始化静态原子成员变量

来自分类Dev

如何在C中使用原子变量?

来自分类Dev

Java原子变量set()vs compareAndSet()

来自分类Dev

将原子变量传递给函数

来自分类Dev

Spring数据Redis原子整数变量键名

来自分类Dev

线程安全使用Java中的原子变量

来自分类Dev

初始化静态原子成员变量

来自分类Dev

使用原子变量同步更多线程

来自分类Dev

是在单核CPU原子上写入变量吗?

来自分类Dev

当变量是原子向量时删除负值

来自分类Dev

变量之间的算术运算

来自分类Dev

哪些整数运算在ios / arm平台上是原子的?

来自分类Dev

原子<T>的算术运算符在哪里/如何定义?