问题标签 [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.

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 投票
2 回答
13132 浏览

c++ - GNU C++ 中的原子交换

我想验证我的理解是否正确。这种事情很棘手,所以我几乎可以肯定我错过了一些东西。我有一个由实时线程和非实时线程组成的程序。我希望非 RT 线程能够交换指向 RT 线程使用的内存的指针。

从文档中,我的理解是这可以通过以下方式完成g++

这是程序中唯一被修改的地方(除了初始设置)rt_data。在rt_data实时上下文中使用时,它被复制到本地指针。因为old_d,稍后当确定旧内存没有被使用时,它将在非 RT 线程中释放。它是否正确?我需要volatile任何地方吗?我应该调用其他同步原语吗?

顺便说一句,我在 C++ 中这样做,尽管我对 C 的答案是否不同感兴趣。

提前谢谢。

0 投票
1 回答
202 浏览

optimization - 这个快速原子锁实现可以工作吗?

我有一个使用条带化来减少锁争用的大型数据结构。现在我正在使用系统锁,但 99.99% 的时间,锁是无争议的,而且持有锁的时间非常少。但是,在持有锁时会执行几个不同的内存操作。实际上,与访问数据结构的总时间相比,获取和释放锁所花费的时间非常重要。

所以我考虑用以下非常简单的锁替换操作系统锁。这里只显示尝试和解锁,因为 99.99% 的时间 FastTryLock() 都会成功。这里的“pLock”变量代表了条带结构中的细粒度锁。

我编写了以下实现,它似乎工作正常,但如果它是正确的或不正确的,我将不胜感激。

在 PC 上,MemoryBarrier_LightWeight() 是无操作的,因为 CPU 保证内存写入顺序。

0 投票
2 回答
2207 浏览

java - 可以创建可以原子交换的 AtomicReference 吗?

有没有办法实现一种引用类型,其值可以与另一个原子交换?


在 Java 中,我们AtomicReference可以将其与局部变量交换,但不能与另一个AtomicReference.

你可以做:

并通过两种操作的组合交换它们:

但这使它们之间处于不一致的状态,两者都包含"hello". 此外,即使您可以原子地交换它们,您仍然无法原子地读取它们(作为一对)。


我想做的是:

然后

交换值,并在另一个线程中:

并确保输出为[hello, world][world, hello]

笔记:

  • r1r2为此操作配对,但另一个线程可能会独立配对,比如说r1和另一个r3(不幸的是,这意味着我不能使用这个解决方案。)
  • 将有数十万个这样的引用,因此全球ReentrantLock将是一个主要瓶颈。
  • rp并且otherRP不一定在线程之间共享,因此简单地锁定它们是行不通的。他们可以被实习,但实习池需要自己的同步,这将是另一个瓶颈。
  • 我在这里只做了 2 组参考,但是能够组合 3 组或更多组将是一个奖励。

是否可以实现的无锁版本AtomicRefPair?我有一种预感,但如果不是,那么也许某处有一篇文章解释了原因?


相关如何在 C# 中原子交换 2 个整数?

0 投票
2 回答
716 浏览

c++ - C++中易失性指针数组的声明

我有一个名为 Ambigous 的结构,在结构内部我有一个指向其他 Ambigous 的指针数组。

我想使用 OSAtomic.h 库来做 CompareandSwaps。

但是,我无法让阵列发挥出色。

是比较和交换功能。

在我的结构里面我有

电话是

当我试图通过

我得到一个错误的 EXE_BAD_ACCESS

所以我想我要回答的是我应该如何声明易失性指针数组?

0 投票
1 回答
225 浏览

mysql - 以原子方式更改 mySQL 中的多行

我有一个表格的 mySQL 表

entryID (PK), UserID, entryName

每个用户(由他的 userID 定义)可以在此表中创建任意数量的条目,但对于每个用户,entryName 必须是唯一的。我想允许用户一次修改他们所有的 entryNames。因此,我将向用户展示一个表单,其中包含他们可以编辑的多个 entryName 字段。

问题在于尝试将其提交到数据库时。我不能像这种情况那样逐行更新:

变得

尝试将 Entry1 重命名为 Entry2 时会导致错误。目前,我使用给定的 UserID 读取所有行,然后删除它们,并重新创建每一行。这行得通。然而,这种方法的问题在于,如果用户设法在我的脚本中造成错误,他的所有条目都会被删除......并丢失。这是一件坏事。如何解决这个问题?

0 投票
1 回答
975 浏览

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) 已变为:

显然,我期待一些原子比较和交换操作,而不仅仅是简单的(线程不安全)分配。我究竟做错了什么?

作为参考,我的编译命令如下所示:

0 投票
1 回答
1287 浏览

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 位系统上正常工作。

背景:目的是实现一些需要这些特定硬件原子的多核并发程序。

谢谢阅读。

0 投票
1 回答
692 浏览

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 操作成本高的原因。