问题标签 [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.
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++ 编译器处理。
java - 如何理解 AKKA 中使用的这种 CCAS 锁定机制?
我刚刚在akka中遇到了一段代码。
下面列出了我感兴趣的核心方法。
有两个相关的子问题。
1)这个类SimpleLock的目的是什么
2)关于它如何工作的任何提示或背景知识?
我认为由于这段代码是用 JAVA 和 scala 编写的,因此它利用了 AtomicBoolean 类。所以我也会添加java标签。
欢迎任何建议!不知道为什么有人投票关闭这个问题。
有关的:
synchronization - 为什么比较和交换使用内存和寄存器
为什么原子交换指令(可用于实现自旋锁)在寄存器和内存位置之间交换数据,而不是交换两个寄存器的内容?
c++ - 如果大于则无锁增量
是否有人知道一种无锁方式来执行逻辑上等同于 compare_and_swap_if_greater_than() 的操作?我们有 compare_and_swap(),它实际上是 compare_and_swap_if_equal()。我现在最好的方法是使用自旋互斥锁,但我认为巧妙地使用历史变量、循环和 compare_and_swap() 可能可以避免这种情况。
concurrency - 如何知道 CAS 指令是否成功?
典型的比较和交换指令不会报告它是否成功。相反,它无论如何都只返回旧值。如何快速确定 CAS 是否成功更新了值?
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 中完成的。
c# - 如何:编写一个只能调用一次的线程安全方法?
我正在尝试编写一个线程安全的方法,它只能被调用一次(每个对象实例)。如果之前已经调用过,应该抛出异常。
我想出了两个解决方案。他们都正确吗?如果不是,他们有什么问题?
与
/li>lock
:-
如果我没记错的话,这个解决方案的优点是无锁(这在我的情况下似乎无关紧要),并且它需要更少的私有字段。
我也愿意接受合理的意见,应该首选哪种解决方案,如果有更好的方法,我也会提出进一步的建议。
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 实现的吗?
谢谢!
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 编译吗?