问题标签 [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 投票
1 回答
216 浏览

locking - 如何仅使用 compare_and_swap 实现优先锁?

只考虑比较和交换,我知道如何实现锁。

但是,如何实现自旋锁

1)多个线程可以在尝试锁定时阻塞它 2)然后线程按照它们阻塞的顺序被解除阻塞(并获取锁)?

甚至可能吗?如果没有,我还需要哪些其他原语?

如果是这样,我该怎么做?

谢谢!

0 投票
2 回答
812 浏览

c++ - 相互竞争的原子操作会互相饿死吗?

想象一个有两个线程的程序。他们正在运行以下代码(CAS 指的是比较和交换):

线程 B 是否有可能永久导致线程 A 的 CAS 失败,从而永远不会将 0xdeadbeef 写入“测试”?或者自然调度抖动是否意味着在实践中这永远不会发生?如果在线程 A 的 while 循环中完成了一些工作怎么办?

0 投票
1 回答
1098 浏览

mutex - 条件变量是如何实现的?

这让我困惑了很久。

给定比较和交换等基本原子原语,我可以看到如何实现自旋锁(我可以从中构建互斥锁)。

但是,我看不到如何从中构建条件变量。这是怎么做到的?

0 投票
3 回答
648 浏览

atomic-swap - AtomicSwap 而不是 AtomicCompareAndSwap?

我知道在 MacOSX / PosiX 系统上,通过 g++ 对 C/C++ 代码进行原子比较和交换。

但是,我不需要比较——我只想原子地交换两个值。是否有可用的原子交换操作?[我能找到的所有东西都是 atomic_compare_and_swap ...我只想进行交换,而不进行比较]。

谢谢!

0 投票
2 回答
639 浏览

macos - OSCompareAndSwap (Mac OS X) 是否等同于 CMPXCHG8B?

OSCompareAndSwap (Mac OS X) 是否等同于 CMPXCHG8B?

0 投票
1 回答
265 浏览

macos - OSCompareAndSwap 是否对 CMPXCHG8B 等 ABA 问题免疫?

OSCompareAndSwap 是否对 CMPXCHG8B 等 ABA 问题免疫?

0 投票
5 回答
29215 浏览

java - Java 并发:CAS 与锁定

我正在阅读Java Concurrency in Practice一书。在第 15 章中,他们讨论了非阻塞算法和比较和交换(CAS) 方法。

据记载,CAS 的性能比锁定方法好得多。我想问一下已经使用这两个概念的人,并且想知道您何时更喜欢这两个概念中的哪一个?真的快很多吗?

对我来说,锁的使用更清晰,更容易理解,甚至更好维护(如果我错了,请纠正我)。我们真的应该专注于创建与 CAS 相关的并发代码而不是锁来获得更好的性能提升,还是可持续性更重要?

我知道何时使用什么可能没有严格的规定。但我只是想听听一些关于CAS新概念的意见和经验。

0 投票
3 回答
14909 浏览

c++ - 与 CAS 的原子交换(使用 gcc 同步内置)

可以使用 compare-and-swap 函数以原子方式交换变量吗?我在 x86_64 RedHat Linux 上通过 gcc 使用 C/C++,特别是 __sync 内置函数。例子:

我认为这归结为 x 是否可以在 &x 和 x; 之间变化。例如,如果 &x 构成一个操作,则 x 可能会在参数中的 &x 和 x 之间变化。我想假设上面隐含的比较总是正确的;我的问题是我是否可以。显然有 CAS 的 bool 版本,但是我不能让旧的 x 写入 y。

一个更有用的示例可能是在链表的头部插入或删除(gcc 声称支持指针类型,因此假设 elem 和 head 是这样的):

参考: http: //gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html

0 投票
4 回答
16263 浏览

java - 在 Java 中,AtomicInteger compareAndSet() 与 synchronized 关键字的性能如何?

我正在实现请求实例的 FIFO 队列(为速度而预先分配的请求对象),并开始使用 add 方法上的“同步”关键字。该方法很短(检查固定大小缓冲区中是否有空间,然后将值添加到数组)。使用visualVM,线程似乎比我喜欢的更频繁地阻塞(准确地说是“监视器”)。因此,我将代码转换为使用 AtomicInteger 值来跟踪当前大小,然后在 while 循环中使用 compareAndSet()(就像 AtomicInteger 在内部对诸如 incrementAndGet() 之类的方法所做的那样)。代码现在看起来更长了。

我想知道的是,使用同步和较短的代码与没有同步关键字的较长代码相比,性能开销是多少(所以永远不应该阻塞锁)。

这是带有 synchronized 关键字的旧 get 方法:

这是没有 synchronized 关键字的新 get 方法:

我的猜测是 synchronized 关键字更糟,因为即使代码更短,也有阻塞锁的风险(可能导致线程上下文切换等)。

谢谢!

0 投票
2 回答
6928 浏览

c++ - 使用 OpenMP 原子操作进行获取和添加

我正在使用 OpenMP,需要使用 fetch-and-add 操作。但是,OpenMP 没有提供适当的指令/调用。我想保留最大的可移植性,因此我不想依赖编译器内在函数。

相反,我正在寻找一种方法来利用 OpenMP 的原子操作来实现这一点,但我已经走到了死胡同。这甚至可以做到吗?注意,以下代码几乎可以满足我的要求:

几乎——但不完全是,因为我真的需要x. fetch_and_add应定义为产生与以下相同的结果(仅非锁定):

(如果我没记错的话,可以询问比较和交换的等效问题,但可以根据另一个问题来实现。)