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

java - ConcurrentLinkQueue 实现陷入死锁

我正在学习并发编程并使用 AtomicReference 编写了这个 concurrentLinkeQueue。

以下示例进入死锁。请参见。

}

}

进行线程转储后,它显示线程在下一行永远等待

你能帮忙解释一下为什么线程永远在这里等待吗?

[编辑]解决了--->

}

另一个解决方案->

0 投票
3 回答
2738 浏览

c++ - x86_64 和 ARM 上的原子 CAS 操作是否总是使用 std::memory_order_seq_cst?

正如安东尼威廉姆斯所说

some_atomic.load(std::memory_order_acquire) 只是通过一个简单的加载指令,而 some_atomic.store(std::memory_order_release) 直接通过一个简单的存储指令。

众所周知,在x86上进行操作load()store()内存屏障memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel不需要处理器指令。

但是在ARMv8上,我们知道这里是load()和的内存障碍store()http ://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-1-of- 2 http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-2-of-2

关于 CPU 的不同架构:http: //g.oswego.edu/dl/jmm/cookbook.html

接下来,但对于x86上的 CAS 操作,这两条具有不同内存屏障的行在反汇编代码(MSVS2012 x86_64)中是相同的:

由GCC 4.8.1 x86_64 - GDB编译的反汇编代码:

是否在 x86/x86_64 平台上进行任何原子 CAS 操作,这样的示例atomic_val.compare_exchange_weak(temp, 1, std::memory_order_relaxed, std::memory_order_relaxed);总是对排序感到满意std::memory_order_seq_cst

如果 x86 上的任何 CAS 操作总是以顺序一致性 ( std::memory_order_seq_cst) 运行而不管障碍,那么在 ARMv8 上它是一样的吗?

问题: x86 或 ARM 上std::memory_order_relaxed的块内存总线的顺序应该是什么?CAS

回答:x86 上,任何compare_exchange_weak()带有 any std::memory_orders(even std::memory_order_relaxed)的操作总是转换为LOCK CMPXCHG 带有锁总线的,真正原子的,并且具有与XCHG- “thecmpxchgxchg指令一样昂贵同等成本。

(加法:XCHG等于LOCK XCHG,但CMPXCHG不等于LOCK CMPXCHG(这真的是原子的)

ARM 和 PowerPC 上,任何`compare_exchange_weak()对于不同的 std::memory_orders 都有不同的锁处理器指令,通过LL/SC

x86(CAS 除外)、ARM 和 PowerPC 的处理器内存屏障指令:http: //www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html

0 投票
2 回答
156 浏览

c - 如何在不使用 C 中的锁的情况下原子地修改结构元素?

我想原子地修改结构的一些元素。我当前的实现使用互斥锁来保护关键代码,如下所示。

我打算将此代码移植到不支持 posix 的 RTOS 中,并且我想在不使用互斥锁或禁用/启用中断的情况下自动执行此操作。

我该怎么做这个操作?是否可以使用“原子比较和交换功能”(CAS)?

0 投票
3 回答
1745 浏览

java - 为什么某些原始类型缺少原子版本而某些原始类型存在?

Java 提供了 AtomicIntegerAtomicLong,它们基本上编译成 CAS硬件级别的指令。short但是为什么对于其他原始类型(如和)不存在这样的 AtomicXXXfloatdouble

0 投票
1 回答
176 浏览

java - Java:永远等待的 Thead

考虑以下执行语句:

(1) 线程 A:检查特定锁定状态并失败 (2) 线程 A:因此尝试进入等待状态 (3) 线程 B:完成特定任务并修改线程 A 所需的锁定状态 (4)线程 B:信号 notifyAll()

考虑 Java 的 VM 是否按照以下顺序 (1),(3),(4),(2) 重新排序代码以执行。我相信这种情况是可能的,在这种情况下,可能会出现问题,因为线程 A 永远进入等待状态,因为没有其他线程需要通知!

编辑1:我没有使用同步块来锁定。相反,我使用 AtomicInteger 来锁定一段代码。考虑一个 RWLock 类,它有一个原子变量 N。随着进入锁定状态的 Readers 和 Writers 的数量增加或减少。该问题适用于这种情况,而不适用于同步块/方法。

0 投票
2 回答
191 浏览

java - 这是将 java 同步关键字作为对象实现的好设计吗?

只是为了练习,我想将 java synchronized 关键字实现为 java 对象。你会说下面的代码是一个很好的设计吗?我猜 AtomicReference 的性能与 AtomicBoolean 相似?

建议后更新代码:

0 投票
2 回答
10926 浏览

java - Java 原子变量 set() 与 compareAndSet()

我想知道原子类中 set() 和 compareAndSet() 之间的区别。set() 方法是否也确保原子过程?例如这段代码:

这两种方法是否相同?

0 投票
2 回答
140 浏览

java - Java中的同步块是如何实现的?

在某些时候线程会竞争监视器,此时一个线程应该获胜,Java 是否使用内置于 CPU 中的原子 CAS 操作来实现对这些监视器的获取,如果不是,这是如何工作的?

0 投票
2 回答
1258 浏览

java - JVM 级别的等待/通知如何工作?

等待和通知看起来像是在线程之间传递的消息,如果这是真的,则必须有队列来缓冲这些消息。如果是这样,那么必须有用于向队列添加消息和从队列中删除消息的原子操作,是否每个 Java 线程都必须有一个帮助线程来侦听这些消息?

很高兴听到你的想法。

0 投票
2 回答
3696 浏览

c - 为什么 GCC 填充这个位域?

程序在 C 中使用 std=c99,这是在 64 位机器上。

当我检查 sizeof(epochs) 时,它给了我 12。

我可以告诉 gcc 不要通过添加 __attribute((packed)); 来填充它。所以我可以解决它。但是我真的很想知道为什么要添加 4 个字节来填充这个 64 位结构?

这里主要的是这个结构需要 64 位,因为它在 64 位原子交换操作中一次全部更新,这当然不适用于 12 字节值。