compare-and-swap相关内容
compare-and-swap 函数可以用来原子地交换变量吗?我在 x86_64 RedHat Linux 上通过 gcc 使用 C/C++,特别是 __sync 内置函数.示例: int x = 0, y = 1;y = __sync_val_compare_and_swap(&x, x, y); 我认为这归结为 x 是否可以在 &x 和 x 之间变化;例如,如果 &x 构成一个操作,则
..
Java 中比较和交换的语义是什么?即,AtomicInteger 的比较和交换方法是否只是保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即它就像一个 volatile(一个内存栅栏). 来自文档: weakCompareAndSet 以原子方式读取和有条件地写入变量,但不创建任何发生在排序之前,因此不提供对先前或后续读取和写入除目标对象之
..
我正在阅读Java 并发实践这本书.在第 15 章中,他们讨论了非阻塞算法和 compare-and-swap (CAS) 方法. 据说 CAS 的性能比锁定方法好得多.我想问那些已经使用过这两个概念并且想听听您何时更喜欢这些概念中的哪一个的人?真的有这么快吗? 对我来说,锁的用法更清晰易懂,甚至更好维护(如果我错了,请纠正我).我们真的应该专注于创建与 CAS 相关的并发代码而不是锁
..
显然,可以使用比较和交换指令原子地递增两个整数.本次演讲声称存在这样的算法,但没有详细说明它是什么看起来像. 如何做到这一点? (请注意,一个接一个地递增整数的明显解决方案不是原子的.另外,将多个整数填充到一个机器字中也不算数,因为它会限制可能的范围.) 解决方案 让我想起一个序列锁.不是很准确(从记忆中提取)但大致如下: 让 x、y 和 s 是 64 位整数. 增
..
英特尔文档 说 该指令可以与 LOCK 前缀一起使用,以允许指令自动执行. 我的问题是 CMPXCHG 可以用内存地址操作吗?从文档看来不是,但谁能确认只适用于寄存器中的实际 VALUE,而不适用于内存地址? 如果CMPXCHG 不是原子的,并且必须通过LOCK CMPXCHG(使用LOCK)实现高级语言级别的CAS前缀),引入这样的指令的目的是什么? (我是从高级语
..
正如 安东尼·威廉姆斯所说: some_atomic.load(std::memory_order_acquire) 只是掉线到一个简单的加载指令,以及some_atomic.store(std::memory_order_release) 进入一个简单的存储指令. 众所周知,在 x86 上,load() 和 store() 操作的内存屏障 memory_order_consume,
..
这就是我想要做的:数组 A[] = {1,2,3,4,5}向左旋转 2: A:{3,4,5,1,2} 我们是否有一个简单而好的解决方案来执行此操作?我希望使用这个左旋转值更新数组 A 本身 - 没有额外的空间. 我尝试了各种方法,但对于不同的测试用例,逻辑似乎不同,并且很难找到适合这个看似简单的任务的算法. 注意:我知道只需创建一个具有左旋转值的新数组即可轻松完成此操作.我正在尝
..
我正在尝试使用Maged M. Michael和Michael L. Scott的算法为并发应用程序创建一个非阻塞队列包,如
..
以下示例来自 如果您从CPU缓存中获取了一个脏值 CPU缓存是一致的,因此从CPU缓存中读取的任何内容都是该行的当前全局约定值.“脏"是指只是意味着它与DRAM的内容不匹配,如果/被逐出,则必须将其写回.还可以从存储缓冲区转发装入值,对于该线程最近存储的值尚不全局可见,但这很好,互锁方法是完全障碍,导致也需要等待存储缓冲区耗尽./p> 如果您的意思是过时的,那不是不可能的,像MESI
..
我一直在努力对原子在C ++中的工作方式有一个根本性的误解.我已经编写了以下代码,以使用原子变量作为索引来实现快速环形缓冲区,以便多个线程可以读写该缓冲区.我将代码缩减为这种简单的情况(我意识到仍然有些长.抱歉.).如果我在Linux或Mac OS X上运行此程序,它有时会起作用,但也至少有10%的时间会引发异常.它似乎也运行得非常快,然后放慢速度,甚至可能再次加快速度,这也暗示某些事情不太正确.
..
在下面的示例中,实际发生了什么?成功交换后,为什么价值不会改变? 实时: https://wandbox.org/permlink/f5VYSKfQ9UJqa8FQ std :: atomic标记{false};int main(){std :: thread线程([](){while(true){//等待直到标志不为真{布尔期望= true;while(!flag.com
..
我正在实现一个简单的缓存,该缓存存储为AtomicReference. private AtomicReference> cacheData; 应该从数据库表中(延迟地)填充缓存对象. 我提供了一种将缓存数据返回给调用者的方法,但是如果数据为空(即未加载),则代码需要从数据库加载数据.为了避免同步,我想到了使用compareAndSet()方
..
vs。与do-while 在功能块为空时,同时与do-while在功能上等效 >,尽管看起来更自然: do {} while(keepLooping()); while(keepLooping()){} 一个典型的while / do用例-同时使用空块是用compareAndSet(CAS)强制更新原子对象。例如,下面的代码将以线程安全的方式递增 a :
..
英特尔文档说 该指令可用于 LOCK 前缀允许原子地执行指令。 我的问题是 CMPXCHG 是否可以使用内存地址进行操作?从文档看来,似乎没有,但是没有人能确认仅适用于寄存器中的实际值,而不适用于存储器地址吗? 如果 CMPXCHG 不是原子的,必须通过 LOCK CMPXCHG (带有 LOCK 前缀),完全引入这样一条指令的目的是什么? 解决方案 您正在将高级锁
..
许多C ++ 11 CAS操作(例如 atomic_compare_exchange_weak , atomic_compare_exchange_strong )采用两个指针,并且值,即像这样: bool atomic_compare_exchange(T *指针,期望T *,//伪声明! 所需的T); 相比之下,Microsoft,gcc和Intel的CAS操作都采用
..
我最近在编程中遇到了一个简单的概念,但是当我尝试在cuda中实现它时,我陷入了困境. 假设我有成千上万个元素,而我想找到它们之间最接近的对.我在全局内存中使用atomicMIN(假设我们不想减少),因此,如果每个线程计算的距离小于全局变量中存储的距离,atomicCAS将用较小的值替换它.例如我有全局变量float gbl_min_dist 为此,我使用以下代码: __device__
..
据我了解,synced关键字将本地线程缓存与主内存同步. volatile关键字基本上总是在每次访问时从主存储器读取变量.当然,访问主内存比本地线程缓存要昂贵得多,因此这些操作很昂贵.但是,CAS操作使用低级硬件操作,但仍必须访问主内存.那么CAS操作又如何更快? 解决方案 我相信关键因素就在您所说的-CAS机制使用低级硬件指令,这些指令可实现最小的缓存刷新和争用解决. 其他两种机制
..
可以使用compare-and-swap函数自动交换变量吗? 我正在x86_64 RedHat Linux上通过gcc使用C/C ++,特别是__sync内置文件. 示例: int x = 0, y = 1; y = __sync_val_compare_and_swap(&x, x, y); 我认为这归结为x是否可以在& x和x;之间改变;例如,如果& x构成一个运算,则
..
我想知道原子类中的set()和compareAndSet()之间的区别. set()方法还可以确保原子过程吗?例如下面的代码: public class sampleAtomic{ private static AtomicLong id = new AtomicLong(0); public void setWithSet(long newValue){
..
摘要:我曾期望std::atomic::load和std::memory_order_relaxed接近直接加载指针的性能,至少在加载的值很少变化的情况下.我发现原子加载的性能比Visual Studio C ++ 2012上的正常加载要差得多,因此我决定进行调查.事实证明,原子负载是通过 compare-and-swap 循环实现的,我怀疑这不是最快的实现方式. 问题:std:
..