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

python - 从 2 个数据框列交换单元格字符串

我正在努力从数据框的 2 列交换值,如下所示:

这个想法是测试第 2 列的每个单元格是否为 rs640249,如果不是,则更改为第 1 列中的相应字符串,反之亦然。这样,最终结果将类似于:

我试图迭代元组,但是,元组不支持项目分配。

0 投票
2 回答
2084 浏览

c - 原子比较(不等于)和交换

我想使用原子比较和交换,但不是等于,我只想在内存位置不等于旧值时进行交换。在C中可能吗?

0 投票
3 回答
1307 浏览

java - Java CAS 操作的执行速度比 C 等效,为什么?

  • 在这里,我有尝试使用 CAS 执行原子增量操作的 Java 和 C 代码。
  • 将 long 变量从 0 增加到 500,000,000。
  • C:耗时:7300ms
  • Java:耗时:2083ms
  • 任何人都可以仔细检查这些结果吗?因为我简直不敢相信他们。
  • 谢谢

Java代码:

C代码:

运行.sh

其他详情:

0 投票
1 回答
5535 浏览

java - 使用 AtomicReference.compareAndSet 设置对数据库调用结果的引用是否合适?

我正在实现一个简单的缓存,缓存存储为 AtomicReference。

缓存对象应该(懒惰地)从数据库表中填充。

我提供了一种将缓存数据返回给调用者的方法,但是如果数据为空(即未加载),则代码需要从数据库中加载数据。为了避免同步,我想到了使用 compareAndSet() 方法:

以这种方式使用 compareAndSet 是否可以,即。将数据库调用作为原子操作的一部分?它比仅仅同步方法更好/更差吗?

非常感谢您的任何建议..

0 投票
1 回答
1555 浏览

c++ - 应该 std::atomic::load 正在做一个比较和交换循环?

摘要:我曾预计std::atomic<int*>::loadwithstd::memory_order_relaxed将接近直接加载指针的性能,至少在加载的值很少更改时。我看到原子负载的性能比 Visual Studio C++ 2012 上的正常负载差得多,因此我决定进行调查。事实证明,原子负载是作为比较和交换循环实现的,我怀疑这不是最快的实现。

问题:是否有某些原因std::atomic<int*>::load需要进行比较和交换循环?

背景:我相信 MSVC++ 2012 正在基于此测试程序对指针的原子负载进行比较和交换循环:

我正在使用一个__declspec(noinline)函数来隔离与原子负载相关的汇编指令。我做了一个新的MSVC++ 2012项目,添加了一个x64平台,选择了发布配置,在调试器中运行程序并查看了反汇编。事实证明,std::atomic<char>std::atomic<int>参数最终都给出了相同的调用loadRelaxed<int>- 这一定是优化器所做的事情。这是被调用的两个 loadRelaxed 实例的反汇编:

loadRelaxed<int * __ptr64>

loadRelaxed<int>

该指令lock cmpxchg是原子比较和交换,我们在这里看到原子加载 a char、 anint或 an的代码int*是一个比较和交换循环。我还为 32 位 x86 构建了这段代码,该实现仍然基于lock cmpxchg.

问题:是否有某些原因std::atomic<int*>::load需要进行比较和交换循环?

0 投票
5 回答
5646 浏览

java - AtomicBoolean.set(flag) 和 AtomicBoolean.compareAndSet(!flag, flag) 有什么区别?

我想知道调用之间是否有任何区别(或可能的副作用):

状态的 JavaDoc AtomicBoolean#set

无条件设置为给定值。

虽然AtomicBoolean#compareAndSet说:

如果当前值 == 预期值,则自动将值设置为给定的更新值。

在这两种情况下,该值都将设置为 true。那么区别是什么呢?

0 投票
3 回答
443 浏览

c - 具有比较和交换的 int 队列具有竞争条件

我已经编写了一个用于保存整数的同步队列,并且面临着一个我似乎无法理解的奇怪的竞争条件。

不要发布解决方案,我知道如何修复代码并使其工作,我想知道竞态条件是什么以及为什么它没有按预期工作。请帮助我了解出了什么问题以及原因。

首先是代码的重要部分:

这假设应用程序永远不会超过缓冲区可以容纳的内容,因此不检查当前缓冲区大小

这似乎有一个罕见的竞争条件,似乎不会增加write_offset. 在 RedHat 2.6.32 Intel(R) Xeon(R) 上的 OS X gcc 4.2、Intel Core i5 四核和 Linux Intel C Compiler 12 上测试。两者都会产生竞争条件。

带有测试用例的完整源代码:

0 投票
1 回答
1199 浏览

windows - 共享内存段中位置的原子比较和交换

我想了解使用InterlockedCompareExchange()更改使用CreateFileMapping(INVALID_HANDLE_VALUE ) 创建并在多个进程之间共享的段中的内存是否存在任何隐藏问题。

换句话说,进程能否依赖 CAS 语义来操作它们共享的内存块?我想他们可以,只是想确认一下。

谢谢

0 投票
1 回答
429 浏览

c++ - 编译器如何知道不从锁定/解锁内部优化语句?在 C++ 中使用 boost::spinlocks

从单独的线程调用具有两个重载operator()函数的类。请参阅下面代码中的//注释。

优化器是否知道不要entryadd = mSpread * ENTRY_MULTIPLIER超过lock()?

那这个呢?

我的定义会entryadd移到函数的顶部吗?

除非我错过了一些东西.. 似乎代码块中的锁定和解锁将不起作用。必须使用 scoped_lock。 boost::detail::spinlock::scoped_lock mylock(mSpreadLock),它将在函数调用期间锁定。

当然我可以像这样破解它:(但效率较低)

0 投票
2 回答
931 浏览

visual-studio-2010 - 使用 Visual C++ (2010) 在 64 位版本中生成 CMPXCHG(无 LOCK)

我需要在同一 CPU 上运行的多个线程的上下文中使用 CAS 函数(假设所有线程都静态地粘合到选定的 CPU,通过SetThreadAffinityMask)。

InterlockedCompareExchange生成LOCK CMPXCHG。LOCK 部分会带来一些副作用,例如缓存未命中、总线锁定以及与其他 CPU 争用的可能性,所有这些都很好,但考虑到这种情况,感觉就像是一种奢侈的过度。由于竞争线程在同一个 CPU 上运行,我假设可以删除 LOCK,并且我进一步假设它应该会提高性能。

所以这是我的第一个问题——我假设正确吗?

--

我知道如何使用 32 位版本的内联汇编生成 CMPXCHG。此外,根据这个 SO 线程,我也知道如何处理 64 位版本,作为函数调用。

我不明白,这是我的第二个问题,是如何生成它的内联版本。

--

谢谢。