compare-and-swap相关内容

Java 比较和交换语义和性能

Java 中比较和交换的语义是什么?即,AtomicInteger 的比较和交换方法是否只是保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即它就像一个 volatile(一个内存栅栏). 来自文档: weakCompareAndSet 以原子方式读取和有条件地写入变量,但不创建任何发生在排序之前,因此不提供对先前或后续读取和写入除目标对象之 ..
发布时间:2021-12-28 23:03:58 Java开发

Java 并发:CAS 与锁定

我正在阅读Java 并发实践这本书.在第 15 章中,他们讨论了非阻塞算法和 compare-and-swap (CAS) 方法. 据说 CAS 的性能比锁定方法好得多.我想问那些已经使用过这两个概念并且想听听您何时更喜欢这些概念中的哪一个的人?真的有这么快吗? 对我来说,锁的用法更清晰易懂,甚至更好维护(如果我错了,请纠正我).我们真的应该专注于创建与 CAS 相关的并发代码而不是锁 ..
发布时间:2021-12-28 22:35:51 Java开发

使用 CAS 原子地递增两个整数

显然,可以使用比较和交换指令原子地递增两个整数.本次演讲声称存在这样的算法,但没有详细说明它是什么看起来像. 如何做到这一点? (请注意,一个接一个地递增整数的明显解决方案不是原子的.另外,将多个整数填充到一个机器字中也不算数,因为它会限制可能的范围.) 解决方案 让我想起一个序列锁.不是很准确(从记忆中提取)但大致如下: 让 x、y 和 s 是 64 位整数. 增 ..
发布时间:2021-11-30 14:53:38 其他开发

x86 CMPXCHG 是原子的,如果是,为什么需要 LOCK?

英特尔文档 说 该指令可以与 LOCK 前缀一起使用,以允许指令自动执行. 我的问题是 CMPXCHG 可以用内存地址操作吗?从文档看来不是,但谁能确认只适用于寄存器中的实际 VALUE,而不适用于内存地址? 如果CMPXCHG 不是原子的,并且必须通过LOCK CMPXCHG(使用LOCK)实现高级语言级别的CAS前缀),引入这样的指令的目的是什么? (我是从高级语 ..
发布时间:2021-11-30 14:45:21 其他开发

左旋转数组 C++

这就是我想要做的:数组 A[] = {1,2,3,4,5}向左旋转 2: A:{3,4,5,1,2} 我们是否有一个简单而好的解决方案来执行此操作?我希望使用这个左旋转值更新数组 A 本身 - 没有额外的空间. 我尝试了各种方法,但对于不同的测试用例,逻辑似乎不同,并且很难找到适合这个看似简单的任务的算法. 注意:我知道只需创建一个具有左旋转值的新数组即可轻松完成此操作.我正在尝 ..
发布时间:2021-10-26 18:51:11 C/C++开发

Interlocked.CompareExchange是否也应该是一个可变变量?

以下示例来自 如果您从CPU缓存中获取了一个脏值 CPU缓存是一致的,因此从CPU缓存中读取的任何内容都是该行的当前全局约定值.“脏"是指只是意味着它与DRAM的内容不匹配,如果/被逐出,则必须将其写回.还可以从存储缓冲区转发装入值,对于该线程最近存储的值尚不全局可见,但这很好,互锁方法是完全障碍,导致也需要等待存储缓冲区耗尽./p> 如果您的意思是过时的,那不是不可能的,像MESI ..
发布时间:2021-04-24 21:07:42 C#/.NET

具有原子索引的环形缓冲区

我一直在努力对原子在C ++中的工作方式有一个根本性的误解.我已经编写了以下代码,以使用原子变量作为索引来实现快速环形缓冲区,以便多个线程可以读写该缓冲区.我将代码缩减为这种简单的情况(我意识到仍然有些长.抱歉.).如果我在Linux或Mac OS X上运行此程序,它有时会起作用,但也至少有10%的时间会引发异常.它似乎也运行得非常快,然后放慢速度,甚至可能再次加快速度,这也暗示某些事情不太正确. ..
发布时间:2021-04-12 19:22:34 C/C++开发

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

我正在实现一个简单的缓存,该缓存存储为AtomicReference. private AtomicReference> cacheData; 应该从数据库表中(延迟地)填充缓存对象. 我提供了一种将缓存数据返回给调用者的方法,但是如果数据为空(即未加载),则代码需要从数据库加载数据.为了避免同步,我想到了使用compareAndSet()方 ..
发布时间:2021-02-10 18:30:39 Java开发

在什么情况下,while可以比while更有效率?

vs。与do-while 在功能块为空时,同时与do-while在功能上等效 >,尽管看起来更自然: do {} while(keepLo​​oping()); while(keepLo​​oping()){} 一个典型的while / do用例-同时使用空块是用compareAndSet(CAS)强制更新原子对象。例如,下面的代码将以线程安全的方式递增 a : ..
发布时间:2020-10-26 00:32:50 Java开发

x86 CMPXCHG是原子的,如果是这样,为什么它需要LOCK?

英特尔文档说 该指令可用于 LOCK 前缀允许原子地执行指令。 我的问题是 CMPXCHG 是否可以使用内存地址进行操作?从文档看来,似乎没有,但是没有人能确认仅适用于寄存器中的实际值,而不适用于存储器地址吗? 如果 CMPXCHG 不是原子的,必须通过 LOCK CMPXCHG (带有 LOCK 前缀),完全引入这样一条指令的目的是什么? 解决方案 您正在将高级锁 ..
发布时间:2020-10-07 20:26:10 其他开发

如何在CUDA中将atomicCAS用于带有条件的多个变量

我最近在编程中遇到了一个简单的概念,但是当我尝试在cuda中实现它时,我陷入了困境. 假设我有成千上万个元素,而我想找到它们之间最接近的对.我在全局内存中使用atomicMIN(假设我们不想减少),因此,如果每个线程计算的距离小于全局变量中存储的距离,atomicCAS将用较小的值替换它.例如我有全局变量float gbl_min_dist 为此,我使用以下代码: __device__ ..
发布时间:2020-09-13 19:29:03 其他开发

为什么CAS(原子)操作比同步或易失性操作快

据我了解,synced关键字将本地线程缓存与主内存同步. volatile关键字基本上总是在每次访问时从主存储器读取变量.当然,访问主内存比本地线程缓存要昂贵得多,因此这些操作很昂贵.但是,CAS操作使用低级硬件操作,但仍必须访问主内存.那么CAS操作又如何更快? 解决方案 我相信关键因素就在您所说的-CAS机制使用低级硬件指令,这些指令可实现最小的缓存刷新和争用解决. 其他两种机制 ..
发布时间:2020-09-13 19:26:15 其他开发

应该在std :: atomic< int *> :: load进行比较和交换循环吗?

摘要:我曾期望std::atomic::load和std::memory_order_relaxed接近直接加载指针的性能,至少在加载的值很少变化的情况下.我发现原子加载的性能比Visual Studio C ++ 2012上的正常加载要差得多,因此我决定进行调查.事实证明,原子负载是通过 compare-and-swap 循环实现的,我怀疑这不是最快的实现方式. 问题:std: ..