|
1
9
您需要一个非x86 CPU,通常使用
load-linked / store-conditional
如ARM或AArch64(在ARMv8.1之前)。x86
CAS_ weak可以编译为单个LL/SC尝试;CAS_strong必须编译到LL/SC重试循环,只有在比较为假时才会失败,而不仅仅是来自其他线程对缓存行的竞争。(
As on Godbolt
,适用于ARMv8
让一个线程使用CAS_weak对一个std::atomic变量执行1亿次增量。( https://preshing.com/20150402/you-can-do-any-kind-of-atomic-read-modify-write-operation/ 解释了如何使用CAS重试循环在一个变量上实现任意原子RMW操作,但由于这是唯一的线程写入,CAS_strong将始终成功,我们不需要重试循环。我的Godbolt示例显示了使用CAS_weak与CAS_strong进行单次增量尝试。) 要使CAS_weak而不是CAS_strong出现虚假故障,请让另一个线程读取相同的变量,或者在同一个缓存行中写入其他内容。
或者做一些类似的事情
完成后,100M CAS_strong尝试将使变量从0增加到100000000。但是100M CAS_weak尝试将增加到某个较低的值,不同之处在于失败次数。 |