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

c++ - 任何人都可以将这个 C++ 代码(来自 OpenJDK6)解释成简单的英语吗?

这是OpenJDK6 的hotspot/src/share/vm/prims/unsafe.cpp代码片段(从第 1082 行开始):

还添加了关键方法oopDesc::atomic_compare_exchange_oop

这段代码在 JVM 上下文中的目的是什么?我在 C++ 方面没有经验。

Atomic::cmpxchg & Atomic::cmpxchg_ptr依赖于 OS & CPU & 32bit/64bit。所以 JVM 在这里被拆分。

编辑

正如 steve-O 所指出的,CAS 有其作为 ABA 问题的弱点,因此这里需要内存屏障以确保 CAS 在多线程环境中仍然正确。此外,由于 CAS 需要地址、旧值和新值三个参数,因此此过程需要现代 CPU。

编辑

有了新的C++0x 标准(现在还没有正式发布?),是不是意味着 JVM 就不需要拆分了?至少,在源代码级别。二进制文件仍然可以拆分,但将由 C++ 编译器处理。

0 投票
1 回答
244 浏览

java - 如何理解 AKKA 中使用的这种 CCAS 锁定机制?

我刚刚在akka中遇到了一段代码。

https://codereview.scala-lang.org/fisheye/browse/~raw,r=25521/scala-svn/scala/trunk/test/files/presentation/akka/src/akka/util/LockUtil.scala

下面列出了我感兴趣的核心方法。

有两个相关的子问题。

1)这个类SimpleLock的目的是什么

2)关于它如何工作的任何提示或背景知识?

我认为由于这段代码是用 JAVA 和 scala 编写的,因此它利用了 AtomicBoolean 类。所以我也会添加java标签。

欢迎任何建议!不知道为什么有人投票关闭这个问题。

有关的:

任何人都可以将这个 C++ 代码(来自 OpenJDK6)解释成简单的英语吗?

0 投票
1 回答
297 浏览

synchronization - 为什么比较和交换使用内存和寄存器

为什么原子交换指令(可用于实现自旋锁)在寄存器和内存位置之间交换数据,而不是交换两个寄存器的内容?

0 投票
1 回答
321 浏览

c++ - 如果大于则无锁增量

是否有人知道一种无锁方式来执行逻辑上等同于 compare_and_swap_if_greater_than() 的操作?我们有 compare_and_swap(),它实际上是 compare_and_swap_if_equal()。我现在最好的方法是使用自旋互斥锁,但我认为巧妙地使用历史变量、循环和 compare_and_swap() 可能可以避免这种情况。

0 投票
1 回答
213 浏览

concurrency - 如何知道 CAS 指令是否成功?

典型的比较和交换指令不会报告它是否成功。相反,它无论如何都只返回旧值。如何快速确定 CAS 是否成功更新了值?

0 投票
3 回答
3375 浏览

c++ - 在 C++ 中将指针转换为 volatile void**

我有相当不错的 C++ 技能,但是这个演员给我带来了问题。我有一个接受以下参数的函数:(volatile void **, void * , void*). 我有 3 个int*变量,我试图将它们作为(&var1, var2, var3). 但是,我收到以下错误:Cannot convert parameter 1 from int** to volatile void**. 是否需要制作特定的演员表才能做到这一点?下面是我正在使用的代码片段。任何帮助是极大的赞赏。

这是在 Windows XP 机器上的 VS2010 中完成的。

0 投票
3 回答
1385 浏览

c - 64 位比较和交换 (CAS) 应该在 32 位机器上工作吗?(或 64 位机器?)

0 投票
3 回答
1720 浏览

c# - 如何:编写一个只能调用一次的线程安全方法?

我正在尝试编写一个线程安全的方法,它只能被调用一次(每个对象实例)。如果之前已经调用过,应该抛出异常。

我想出了两个解决方案。他们都正确吗?如果不是,他们有什么问题?

  1. lock

    /li>
  2. Interlocked.CompareExchange

    如果我没记错的话,这个解决方案的优点是无锁(这在我的情况下似乎无关紧要),并且它需要更少的私有字段。

我也愿意接受合理的意见,应该首选哪种解决方案,如果有更好的方法,我也会提出进一步的建议。

0 投票
1 回答
5189 浏览

linux - gcc __sync_bool_compare_and_swap 和 cmpxchg 有什么区别?

为了使用 cas,gcc 提供了一些有用的函数,例如
__sync_bool_compare_and_swap

但我们也可以使用像 cmpxchg 这样的 asm 代码

我grep了gcc 4.6.3的源码,发现__sync_bool_compare_and_swap是实现使用

似乎 0xffff0fc0 是一些内核辅助函数的地址

但是在gcc 4.1.2中,没有像__kernel_cmpxchg_t这样的代码,也找不到__sync_bool_compare_and_swap的实现。

那么 __sync_bool_compare_and_swap 和 cmpxchg 有什么区别?

__sync_bool_compare_and_swap 是由 cmpxchg 实现的吗?

并且使用内核辅助函数 __kernel_cmpxchg_t,它是由 cmpxchg 实现的吗?

谢谢!

0 投票
3 回答
914 浏览

gcc - Solaris 10 上的 gcc 编译错误

我想编译一个源代码,但是关于__sync_xxx函数(__sync_bool_compare_and_swap等)有一些编译错误

机器上的 GCC 版本是 3.4.3(它必须是 gcc 4.1 或更高版本才能支持原子内置),所以我下载了 GCC v4.6,将其复制到另一个目录(我没有删除 v3.4.3)然后更改$PATH路径对于 GCC 但它不起作用(发生相同的错误)。

我想问一下,只是改变 gcc 路径export PATH=...足以用新的 GCC 编译吗?