问题标签 [atomic-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.
atomic-swap - AtomicSwap 而不是 AtomicCompareAndSwap?
我知道在 MacOSX / PosiX 系统上,通过 g++ 对 C/C++ 代码进行原子比较和交换。
但是,我不需要比较——我只想原子地交换两个值。是否有可用的原子交换操作?[我能找到的所有东西都是 atomic_compare_and_swap ...我只想进行交换,而不进行比较]。
谢谢!
macos - OSCompareAndSwap (Mac OS X) 是否等同于 CMPXCHG8B?
OSCompareAndSwap (Mac OS X) 是否等同于 CMPXCHG8B?
c++ - GNU C++ 中的原子交换
我想验证我的理解是否正确。这种事情很棘手,所以我几乎可以肯定我错过了一些东西。我有一个由实时线程和非实时线程组成的程序。我希望非 RT 线程能够交换指向 RT 线程使用的内存的指针。
从文档中,我的理解是这可以通过以下方式完成g++
:
这是程序中唯一被修改的地方(除了初始设置)rt_data
。在rt_data
实时上下文中使用时,它被复制到本地指针。因为old_d
,稍后当确定旧内存没有被使用时,它将在非 RT 线程中释放。它是否正确?我需要volatile
任何地方吗?我应该调用其他同步原语吗?
顺便说一句,我在 C++ 中这样做,尽管我对 C 的答案是否不同感兴趣。
提前谢谢。
optimization - 这个快速原子锁实现可以工作吗?
我有一个使用条带化来减少锁争用的大型数据结构。现在我正在使用系统锁,但 99.99% 的时间,锁是无争议的,而且持有锁的时间非常少。但是,在持有锁时会执行几个不同的内存操作。实际上,与访问数据结构的总时间相比,获取和释放锁所花费的时间非常重要。
所以我考虑用以下非常简单的锁替换操作系统锁。这里只显示尝试和解锁,因为 99.99% 的时间 FastTryLock() 都会成功。这里的“pLock”变量代表了条带结构中的细粒度锁。
我编写了以下实现,它似乎工作正常,但如果它是正确的或不正确的,我将不胜感激。
在 PC 上,MemoryBarrier_LightWeight() 是无操作的,因为 CPU 保证内存写入顺序。
java - 可以创建可以原子交换的 AtomicReference 吗?
有没有办法实现一种引用类型,其值可以与另一个原子交换?
在 Java 中,我们AtomicReference
可以将其与局部变量交换,但不能与另一个AtomicReference
.
你可以做:
并通过两种操作的组合交换它们:
但这使它们之间处于不一致的状态,两者都包含"hello"
. 此外,即使您可以原子地交换它们,您仍然无法原子地读取它们(作为一对)。
我想做的是:
然后
交换值,并在另一个线程中:
并确保输出为[hello, world]
或[world, hello]
。
笔记:
r1
并r2
为此操作配对,但另一个线程可能会独立配对,比如说r1
和另一个r3
(不幸的是,这意味着我不能使用这个解决方案。)- 将有数十万个这样的引用,因此全球
ReentrantLock
将是一个主要瓶颈。 rp
并且otherRP
不一定在线程之间共享,因此简单地锁定它们是行不通的。他们可以被实习,但实习池需要自己的同步,这将是另一个瓶颈。- 我在这里只做了 2 组参考,但是能够组合 3 组或更多组将是一个奖励。
是否可以实现的无锁版本AtomicRefPair
?我有一种预感,但如果不是,那么也许某处有一篇文章解释了原因?
c++ - C++中易失性指针数组的声明
我有一个名为 Ambigous 的结构,在结构内部我有一个指向其他 Ambigous 的指针数组。
我想使用 OSAtomic.h 库来做 CompareandSwaps。
但是,我无法让阵列发挥出色。
是比较和交换功能。
在我的结构里面我有
电话是
当我试图通过
我得到一个错误的 EXE_BAD_ACCESS
所以我想我要回答的是我应该如何声明易失性指针数组?
mysql - 以原子方式更改 mySQL 中的多行
我有一个表格的 mySQL 表
entryID (PK), UserID, entryName
每个用户(由他的 userID 定义)可以在此表中创建任意数量的条目,但对于每个用户,entryName 必须是唯一的。我想允许用户一次修改他们所有的 entryNames。因此,我将向用户展示一个表单,其中包含他们可以编辑的多个 entryName 字段。
问题在于尝试将其提交到数据库时。我不能像这种情况那样逐行更新:
变得
尝试将 Entry1 重命名为 Entry2 时会导致错误。目前,我使用给定的 UserID 读取所有行,然后删除它们,并重新创建每一行。这行得通。然而,这种方法的问题在于,如果用户设法在我的脚本中造成错误,他的所有条目都会被删除......并丢失。这是一件坏事。如何解决这个问题?
linux - GLIB:g_atomic_int_get 变成 NO-OP?
在一段较大的代码中,我注意到 glib 中的 g_atomic_* 函数并没有达到我的预期,所以我写了这个简单的例子:
当我使用 GCC 的 '-E' 选项(预处理后停止)编译它时,我注意到对 g_atomic_int_get(&foo) 的调用已变为:
并且 g_atomic_int_set(((int*)ptr), 42) 已变为:
显然,我期待一些原子比较和交换操作,而不仅仅是简单的(线程不安全)分配。我究竟做错了什么?
作为参考,我的编译命令如下所示:
sunstudio - Sun 编译器相当于 gcc 的 __sync_fetch_and_add?又名甲骨文工作室 12.2
适用于 64 位 Linux 的 Oracle (Sun) Studio 12.2 C/C++/Fortran 编译器是否具有与 gcc 中提供的 __sync_fetch_and_add 函数等效的功能?我似乎无法在 Sun 文档中找到 intel atomics 的包装代码,也无法在我的 Sun Studio 安装中找到 .h 文件。这意味着要么我不擅长搜索,要么它可能不存在,不确定是哪个。
我碰巧需要使用 Sun C/C++ 编译器访问 intel i7 上可用的任何原子硬件功能,例如 Test-and-set、Compare-and-swap、Fetch-and-foo。
这很复杂,因为我不是汇编程序员,而且这是 Sun 编译器而不是 GCC 编译器,所以从 gcc 的开源实现中复制 asm 代码不一定能工作,最后它是 64 位编译器和硬件,因此很容易找到的 32 位示例不一定能在 64 位系统上正常工作。
背景:目的是实现一些需要这些特定硬件原子的多核并发程序。
谢谢阅读。
solaris-10 - 原子操作实现
我在 <sys/atomic.h> 中使用 SunOs 提供的原子操作,
void *atomic_cas_ptr(volatile void *target, void *cmp, void *newval);
现在要使其可用,我必须检查此函数返回的旧值和被调用函数 cmp 传递的旧值是否相同,如果它们是则操作是成功的。
但我有一定的疑问:由于这个函数返回一个指向旧值的 void 指针,我们称它为 void *old 并且我正在传递 void *cmp,那么我需要比较这两个 old 和 cmp,所以我将如何比较这两个 ?如果在比较 *old 时发生了变化,那我该怎么办?
本质上,我想做的是在另一个函数内部扭曲这个函数,该函数接受这三个参数并返回真或假,这表明成功或失败。
有关CAS
,我读到将其称为无锁操作是用词不当,因为它最终会锁定硬件(锁定总线),对吗?这就是为什么 CAS 操作成本高的原因。