问题标签 [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.
java - ConcurrentLinkQueue 实现陷入死锁
我正在学习并发编程并使用 AtomicReference 编写了这个 concurrentLinkeQueue。
以下示例进入死锁。请参见。
}
}
进行线程转储后,它显示线程在下一行永远等待
你能帮忙解释一下为什么线程永远在这里等待吗?
[编辑]解决了--->
}
另一个解决方案->
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
- “thecmpxchg
xchg
指令一样昂贵同等成本。
(加法: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
c - 如何在不使用 C 中的锁的情况下原子地修改结构元素?
我想原子地修改结构的一些元素。我当前的实现使用互斥锁来保护关键代码,如下所示。
我打算将此代码移植到不支持 posix 的 RTOS 中,并且我想在不使用互斥锁或禁用/启用中断的情况下自动执行此操作。
我该怎么做这个操作?是否可以使用“原子比较和交换功能”(CAS)?
java - 为什么某些原始类型缺少原子版本而某些原始类型存在?
Java 提供了 AtomicInteger
等AtomicLong
,它们基本上编译成 CAS
硬件级别的指令。short
但是为什么对于其他原始类型(如和)不存在这样的 AtomicXXXfloat
类double
?
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 的数量增加或减少。该问题适用于这种情况,而不适用于同步块/方法。
java - 这是将 java 同步关键字作为对象实现的好设计吗?
只是为了练习,我想将 java synchronized 关键字实现为 java 对象。你会说下面的代码是一个很好的设计吗?我猜 AtomicReference 的性能与 AtomicBoolean 相似?
建议后更新代码:
java - Java 原子变量 set() 与 compareAndSet()
我想知道原子类中 set() 和 compareAndSet() 之间的区别。set() 方法是否也确保原子过程?例如这段代码:
这两种方法是否相同?
java - Java中的同步块是如何实现的?
在某些时候线程会竞争监视器,此时一个线程应该获胜,Java 是否使用内置于 CPU 中的原子 CAS 操作来实现对这些监视器的获取,如果不是,这是如何工作的?
java - JVM 级别的等待/通知如何工作?
等待和通知看起来像是在线程之间传递的消息,如果这是真的,则必须有队列来缓冲这些消息。如果是这样,那么必须有用于向队列添加消息和从队列中删除消息的原子操作,是否每个 Java 线程都必须有一个帮助线程来侦听这些消息?
很高兴听到你的想法。
c - 为什么 GCC 填充这个位域?
程序在 C 中使用 std=c99,这是在 64 位机器上。
当我检查 sizeof(epochs) 时,它给了我 12。
我可以告诉 gcc 不要通过添加 __attribute((packed)); 来填充它。所以我可以解决它。但是我真的很想知道为什么要添加 4 个字节来填充这个 64 位结构?
这里主要的是这个结构需要 64 位,因为它在 64 位原子交换操作中一次全部更新,这当然不适用于 12 字节值。