当我使用x86_64 CAS指令时LOCK CMPXCHG,即原子(读取值,比较并写回结果),此时锁定的内容:
这是真的吗,x86_64 Intel CPU使用?
concurrency multithreading x86-64 compare-and-swap cpu-cache
因为Atomic意味着线程安全.当.set()本身在Java中是Atomic和线程安全时,我们何时使用compareAndSet?
比如说我想原子地设置一个变量,这样每个其他线程都可以看到它(但我希望变量以线程安全的方式设置)我可以简单地将它声明为易失性AtomicBoolean或volatile AtomicInteger,这应该是正确的?我需要使用compareAndSet的一些情况是什么?
今天我接受了一个采访的下一个问题:"如果你在一台不支持CAS操作的处理器的机器上调用它,那么来自AtomicLong的compareAndSet方法是怎么回事".
如果可能的话,请您帮我解决这个问题并提供一些全面的描述链接?
我读了一篇文章,描述了ABA问题,但有些东西,我无法理解.我有源代码,它无法工作,它类似于文章中的示例,但我不明白这个问题.这是文章
http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6
它说:虽然head_的实际值是相同的(a)next_指针是NOT
但它怎么可能呢?如果是两个结构对象
struct node {
node *next;
data_type data;
};
Run Code Online (Sandbox Code Playgroud)
"head_"和"current"指向内存中的同一区域,如何头_-> next和current-> next指向不同?
它还说:最后一个操作,foo SUCCEEDS的比较和交换,它不应该.
那该怎么办?加载相同的地址,然后重试?有什么不同?
目前在我的代码中我有类似的情况,我在对象上做CompareAndSwap,可能会被另一个线程更改为具有类似地址的对象
deleted.compare_exchange_strong(head, 0);
Run Code Online (Sandbox Code Playgroud)
但是如果更改的对象被初始化很好并且它的下一个指针包含指向初始化对象的指针那么问题是什么?
提前致谢.
有人可以帮助我编写无阻塞,无锁的 stack实现。Sun Java实现中有吗?
我试图Stack通过在整个堆栈数据结构上放置全局锁来编写线程安全的(这很昂贵),但是似乎可以编写无阻塞,无锁的 堆栈。
如果无锁且不受死锁影响的算法称为非阻塞算法。
马丁汤普森断言,依赖于依靠CAS的参考的STM最终将受到Amdahl定律的限制.Amdahl定律是并行程序的最大性能受到程序的顺序(非并行)部分的限制.马丁汤普森说CAS本质上是不平行的吗?
parallel-processing concurrency compare-and-swap sequential parallelism-amdahl
我经常遇到这样的情况,我希望这个问题可以像这样解决:
AtomicBoolean bool1 = new AtomicBoolean();
AtomicBoolean bool2 = new AtomicBoolean();
boolean expected = false; // whatever
boolean update = false; // whatever
if(bool1.get()) {
bool2.compareSet(expected, update);
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为可以在bool1.get()和之间进行上下文切换bool2.compareSet(...).那么,什么是需要的是我会称之为"三元原子布尔",这是一件好事,可以做bool1.get()和bool2.compareSet(...)在一个CAS操作.
我的问题是它是否可以完成.有没有人知道有人在考虑这个问题(一些大学)或有人知道现有的解决方案接近所需(我的意思是没有锁,同步块,互斥,semapores,但使用CAS仅基于算法).
我正在尝试使用原子,特别是 __sync_fetch_and_add 来实现旋转线程屏障。https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html
我基本上想要一个 pthread 屏障的替代方案。我在一个可以并行运行大约一百个线程的系统上使用 Ubuntu。
int bar = 0; //global variable
int P = MAX_THREADS; //number of threads
__sync_fetch_and_add(&bar,1); //each thread comes and adds atomically
while(bar<P){} //threads spin until bar increments to P
bar=0; //a thread sets bar=0 to be used in the next spinning barrier
Run Code Online (Sandbox Code Playgroud)
由于明显的原因,这不起作用(一个线程可能设置 bar=0,而另一个线程陷入无限 while 循环等)。我在这里看到了一个实现:使用 c++11 原子编写(旋转)线程屏障,但它似乎太复杂了,我认为它的性能可能比 pthread 屏障更差。
由于 bar 的缓存线在线程之间进行乒乓球交换,因此该实现预计还会在内存层次结构中产生更多流量。
关于如何使用这些原子指令来制作简单的屏障有什么想法吗?另外,通信优化方案也会有所帮助。
16 字节atomic<>变量是否在 16 字节边界上自动对齐,从而允许编译器/运行时库有效地使用 x86CMPXCHG16B指令?或者我们应该根据风格总是手动指定alignas(16)所有这些变量?
在java 17中,AtomicReference有compareAndExchange类似于 的方法compareAndSet,但它不返回布尔值,而是返回原子操作之前的值。我需要它来实现自定义并发结构。
由于项目的限制,我只能使用 Java 8 功能。一些挖掘揭示了VarHandle其中有compareAndExchange。但是,VarHandle需要 Java 9。
因此,看来我必须compareAndExchange亲自实施了。但如何利用现有方法高效地做到这一点呢?(那么compareAndExchangeWeak版本呢?)
(顺便说一句,我不能依赖任何第三方库)
compare-and-swap ×10
java ×5
c++ ×3
concurrency ×3
atomic ×2
x86-64 ×2
barrier ×1
cpu-cache ×1
java-8 ×1
nonblocking ×1
sequential ×1
stdatomic ×1