问题标签 [compare-and-swap]

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 回答
4965 浏览

cuda - 如何在 CUDA 中将 atomicCAS 用于带条件的多个变量

我最近在编程中遇到了一个简单的概念,但是当我尝试在 cuda 中实现它时我卡住了。假设我有数千个元素,我想找到它们之间最近的一对。我atomicMIN在全局内存中使用(假设我们不想减少),所以如果每个线程计算的距离小于存储在全局变量中的距离,atomicCAS 将用较小的值替换它。例如我有全局变量float gbl_min_dist

为此,我使用以下代码:

现在假设我们想要存储靠得更近的两个点的索引,并且atomicMIN已经成功地将旧的最小距离替换为由这两个点计算出的最小距离。我的意思是,当且仅当它的距离刚刚在全局变量中成功交换时,我只想存储当前距离较小的两个点的索引

因此,在这里,当一个线程执行时atomicMIN,如果该线程建议的要比较的值被交换,gbl_min_dist那么我还需要将 p1、p2 与线程中的值交换。如果gbl_min_dist没有交换,那么我不想存储这些点,因为这会给出错误的点但正确的最小距离。

是否有任何返回值来检查是否atomicCAS进行了交换?

关于如何在 中实现这一点的任何想法atomicMIN

提前致谢

0 投票
0 回答
315 浏览

java - 如何对a的索引求和数组列表

我有一个程序,我已经做了很长一段时间了。我需要制作一个程序,通过回溯解决用户指定的求和难题。用户分别输入三个strings,前两个strings加起来应该等于第三个string

例子:

我相信我走在正确的轨道上,但我需要获取每个值的索引,<Character> ArrayList并让它们总和小于20,000. 我该怎么做呢?

下面是我到目前为止的代码:

0 投票
1 回答
7515 浏览

c# - 锁与比较和交换

我一直在阅读有关无锁技术的文章,例如比较和交换以及利用 Interlocked 和 SpinWait 类来实现线程同步而无需锁定。

我自己进行了一些测试,其中我只是有许多线程试图将字符附加到字符串。我尝试使用常规locks 和比较和交换。令人惊讶的是(至少对我而言),锁显示出比使用 CAS 更好的结果。

这是我的代码的 CAS 版本(基于this)。它遵循复制->修改->交换模式:

还有更简单(更高效)的锁版本:

如果我尝试添加 50.000 个字符,CAS 版本需要 1.2 秒,锁定版本需要 700 毫秒(平均)。对于 100k 个字符,它们分别需要 7 秒和 3.8 秒。这是在四核(i5 2500k)上运行的。

我怀疑 CAS 显示这些结果的原因是因为它在最后一个“交换”步骤中失败了很多。我是对的。当我尝试添加 50k 字符(50k 成功交换)时,我能够在 70k(最佳情况)和几乎 200k(最坏情况)之间进行计数失败尝试。最坏的情况是,每 5 次尝试中有 4 次失败。

所以我的问题是:

  1. 我错过了什么?CAS不应该给出更好的结果吗?好处在哪里?
  2. 为什么以及何时 CAS 是更好的选择?(我知道有人问过这个问题,但我找不到任何令人满意的答案来解释我的具体情况)。

我的理解是,使用 CAS 的解决方案虽然难以编码,但随着争用的增加,它的扩展性和性能都比锁好得多。在我的示例中,操作非常小且频繁,这意味着高争用和高频率。那么为什么我的测试结果显示不同呢?

我认为更长的操作会使情况变得更糟->“交换”失败率会增加更多。

PS:这是我用来运行测试的代码:

0 投票
1 回答
1233 浏览

c - 字节数组中的原子集位

你如何原子地设置一个字节的位?我要解决的问题涉及更新大量字节数组,例如 uchar data[262144]。我使用 SET(index,value) 一次只设置一个字节的 2 位,这意味着四个线程可以同时在一个字节中设置值。线程选择相同的字节进行更新是非常罕见的,但确实会发生。使这些操作线程安全的最有效方法是什么?请注意,我不能为每个数据条目使用一个锁,这会太大太慢。

更糟糕的是,有时另一个字节数组 data1[131072] 也需要以线程安全的方式与先前的数据同时更新。但我计划合并这两个数组以简化问题,因此更新第一个数组的原子方式就足够了。

0 投票
2 回答
2918 浏览

java - java中的非阻塞栈

有人可以帮助我编写一个非阻塞、无锁的 stack实现。它在 Sun java 实现中吗?

我试图Stack通过在整个堆栈数据结构上放置一个全局锁来编写一个线程安全的(这很昂贵),但似乎可以编写一个非阻塞、无锁的 堆栈。

如果一个算法是无锁且不受死锁的,则该算法称为非阻塞算法。

0 投票
2 回答
2670 浏览

atomic - 为什么 CAS(原子)操作比同步或易失性操作更快

据我了解, synchronized 关键字将本地线程缓存与主内存同步。volatile 关键字基本上总是在每次访问时从主存储器中读取变量。当然,访问主内存比本地线程缓存要昂贵得多,因此这些操作很昂贵。但是,CAS 操作使用低级硬件操作,但仍必须访问主存储器。那么 CAS 操作如何更快呢?

0 投票
1 回答
1302 浏览

c - 为什么 CompareAndSwap 比 TestAndSet 更强大的指令?

请考虑下面的 CompareAndSwap 代码,让我知道为什么这个原子指令比原子 TestAndSet 更强大,因为它是一个互斥原语?

0 投票
2 回答
206 浏览

java - Java compareAndSet 以原子方式更新 BST 中的引用

在二叉树中,我试图以原子方式将父节点的左子节点替换为新节点。在下面的方法中,pnode.left指向node并且我正在尝试将其更改为replaceNode.

在 line1 中,childPtr正在指向pnode.left
In line2,oldChildPtr正在指向pnode.left
In line3,childPtr从指向 到 原子地更改pnode.leftreplaceNode

pnode.left不变。我知道这就是java中的工作方式。但是我该如何修改这段代码,以便pnode.left原子地替换为replaceNode.

0 投票
0 回答
197 浏览

mips - 32 位 mips cmpxchg(cas) 是否支持 8 字节?

每个人。我正在使用双字在 32 位 mips 中编写程序以避免 ABA 问题。但似乎 32 位 mips 在 Linux 内核源代码中不支持 8 Bytes。如果是这样,是否有人知道 8 字节扩展?还有其他方法可以避免 ABA 问题吗?

0 投票
1 回答
2495 浏览

multithreading - 与空指针比较时,C++11 std::compare_exchange_strong 不编译

我正在研究并行 avl 树并遇到了问题。这是导致此问题的函数:

parent->left有类型,如果当前值为空atomic<Node*>,我想将该指针设置为。node编译器报错

为什么这不是有效的代码?