问题标签 [relaxed-atomics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
202 浏览

multithreading - 在原子上调用“into_inner()”是否考虑了所有轻松的写入?

是否into_inner()返回此示例程序中的所有轻松写入?如果是这样,哪个概念可以保证这一点?

https://play.rust-lang.org/?gist=96f49f8eb31a6788b970cf20ec94f800&version=stable

我知道横梁保证所有线程都已完成,并且由于所有权回到主线程,我也知道不会有未完成的借用,但在我看来,仍然可能有未完成的未决写入,如果不是CPU,然后在缓存中。

into_inner()哪个概念保证在调用时所有写入都完成并且所有缓存都同步回主线程?是否有可能丢失写入?

0 投票
3 回答
727 浏览

c++ - std::atomic::fetch_add 是 x86-64 上的序列化操作吗?

考虑以下代码:

x86-64(比如不到 5 年的架构)中是否有一条指令允许 otherStuff 1 和 2 重新排序,fetch_add或者它是否总是序列化?

编辑:

看起来这可以用“ lock addx86 上的内存屏障吗?”来概括。似乎不是,尽管我不确定在哪里可以找到参考。

0 投票
1 回答
134 浏览

c++ - C++ countdown in CyclicBarrier going wrong using atomic variables [solutions without locks please]

I am trying to implement a cyclic barrier in C++ from scratch. Aim is to implement as conformant to Java implementation as possible. The class reference is here. https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html

Now in my testing the returnStatus should be for each thread which successfully trips the barrier , a value ranging from barrierLimit-1 to zero. I am trying to achieve this using atomic variables and memory fence. but my code is failing testing and in some cases two threads are same value of returnStatus.

Would some one please suggest if any technique can be helpful to resolve this. I want to solve this without using locks so that i can truly apply the lockless behaviour as much as possible.

The full code reference is at : https://github.com/anandkulkarnisg/CyclicBarrier/blob/master/CyclicBarrier.cpp

0 投票
2 回答
839 浏览

c++ - 用于取消标志的 std::atomic_bool:std::memory_order_relaxed 是正确的内存顺序吗?

我有一个从套接字读取并生成数据的线程。每次操作后,线程都会检查一个std::atomic_bool标志以查看它是否必须提前退出。

为了取消操作,我将取消标志设置为true,然后调用join()工作线程对象。

线程和取消函数的代码如下所示:

std::memory_order_relaxed使用原子变量的内存顺序是否正确?

0 投票
1 回答
531 浏览

c++ - 使用宽松的原子布尔值同步两个线程

我和一些同事正在讨论用于同步两个线程的宽松原子布尔值。我们已经进行了一些在线研究,并发现了其他处理宽松原子的示例和片段,但我们未能从适用于我们示例的那些中得出任何结论。

以下原子布尔值在两个线程之间共享。

第一个线程进入一个循环,并且只有在设置了原子布尔值后才退出。请注意,每次循环迭代的负载都标记为松弛。

在第一个线程进入循环后的某个时刻(由其他一些同步机制保证),第二个线程执行以下语句。再次注意,这里的商店被标记为放松。

问题:从纯理论的角度来看,是否保证第一个线程退出循环;为什么?


就我们认为理解宽松原子而言,我们认为加载操作并不能保证看到写入操作的修改。但是其他有关线程安全计数器的在线示例使我们相信负载毕竟会接受修改......

0 投票
1 回答
422 浏览

c++ - 具有宽松内存顺序的 fetch_add 会返回唯一值吗?

想象一下 N 个线程按照简单的代码运行:

哪里num是:

是否可以完全安全地假设,res对于每个运行代码的线程来说,代码会有所不同,或者对于某些线程来说可能是相同的?

0 投票
1 回答
131 浏览

c++ - 在 C++ 标准中滥用 std::memory_order::relaxed 的示例 [algorithms.parallel.exec/5 in n4713]

std::memory_order::relaxedC++ 标准中滥用 of 的例子之一:

然后它说,

上面的例子取决于迭代的执行顺序,如果两个迭代在同一个执行线程上按顺序执行,则不会终止。

问题:

  1. 评论说,“不正确:假定执行顺序”。什么是“假定的执行顺序”?我想念它。

  2. “上面的例子取决于迭代的执行顺序”中的“迭代”指的是什么?这是否意味着while循环中的迭代?或者它是指的迭代std::for_each

  3. 如果 的迭代std::for_each由不同的线程并行执行,那么其中一个迭代/线程不会退出是否仍然正确?因为x.fetch_add(1, std::memory_order::relaxed)是原子的,所以一个线程将产生x1,另一个线程将产生x2,并且两个线程都不可能有 x == 1。不?

0 投票
1 回答
141 浏览

c++ - 对单个变量的原子操作

x以下 C++ 代码片段中的变量可能的最终结果是什么?(请根据 C++ 标准允许的内容而不是当前在不同平台上可用的内容来回答)

理想情况下,我希望x最后为零。是这样吗,即使我正在使用std::memory_order_relaxed

编辑:为了使问题更准确,是否保证 1)在线程 1 和 2 中,返回值是 0 或 1,以及 2)线程 1 和 2 中的返回值不同。

0 投票
3 回答
104 浏览

c++ - 最低订购要求

xy是两个不同类型的变量,std::atomic<int>并假设它们的当前值都是1。什么是最宽松的订购要求,因此以下代码会生成一些输出?(即,应该用于order1... order4?)

0 投票
2 回答
434 浏览

c++ - 宽松的原子存储是否在发布前重新排序?(类似于加载/获取)

我在en.cppreference.com 规范中阅读了关于原子的宽松操作:

“[...]只保证原子性和修改顺序 的一致性。”

所以,我在问自己,当您处理相同或不同的原子变量时,这种“修改顺序”是否有效。

在我的代码中,我有一个原子树,其中一个低优先级、基于事件的消息线程填充了应该更新的节点,将一些数据存储在红色“1”原子(见图)上,使用memory_order_relaxed. 然后它继续使用 fetch_or 在其父级中写入以了解哪个子原子已被更新。每个原子最多支持 64 位,因此我将位 1 填充为红色操作“2”。它一直持续到根原子,它也使用 fetch_or 进行标记,但使用 time memory_order_release

在此处输入图像描述

然后一个快速、实时、不可阻塞的线程加载控制原子(使用memory_order_acquire)并读取启用它的位。然后它递归地更新孩子的原子memory_order_relaxed。这就是我将数据与高优先级线程的每个周期同步的方式。

由于该线程正在更新,因此可以将子原子存储在其父级之前。问题是在我填写子信息之前它存储了一个父项(填充要更新的子项)。

换句话说,正如标题所说,宽松的商店在发布之前是否在它们之间重新排序?我不介意对非原子变量进行重新排序。伪代码,假设 [x, y, z, control] 是原子的并且初始值为 0:

我想知道在实时线程中这是否总是正确的:x <= y <=z。要检查我是否编写了这个小程序:

它是如何工作的:有一个原子数组。一个线程以相反的顺序以宽松的顺序存储,并以释放顺序存储一个控制原子。

另一个线程加载控制原子的获取顺序,然后以放松的原子加载数组的其余值。由于父母不能在孩子之前更新,所以 newValue 应该总是等于或大于 oldValue。

我已经在我的电脑上多次执行了这个程序,调试和发布,它并没有触发失败。我使用的是普通的 x64 Intel i7 处理器。

那么,假设对多个原子的宽松存储至少在与控制原子同步并获取/释放时确实保持“修改顺序”是安全的吗?