我找不到AtomicCmpExchange
的实现(似乎是隐藏的),所以我不知道它的作用。
AtomicCmpExchange
在所有平台上都可靠吗?它是如何在内部实施的?它是否使用类似临界区的东西?
我有这种情况:
MainThread:
Target := 1;
线程1:
x := AtomicCmpExchange(Target, 0, 0);
线程2:
Target := 2;
Thread3:
Target := 3;
x
总是一个整数1,2或3,还是可能是其他东西?我的意思是,即使AtomicCmpExchange(Target, 0, 0)
未能交换该值,它是否返回“有效”整数(我的意思是,不是半读取整数,例如,如果另一个线程已经开始写入该值的一半) )?
我想避免使用临界区,我需要最大速度。
答案 0 :(得分:16)
AtomicCmpExchange
就是所谓的intrinsic routine, or a standard function。它本质上是编译器所知的,可能有也可能没有可见的实现。例如,Writeln
是标准函数,但您无法为其找到单个实现。编译器将其分解为对System.pas中的低级函数的多次调用。某些标准函数(例如Inc()
和Dec()
)在System.pas中没有任何实现。编译器将生成相当于简单INC
或DEC
指令的机器指令。
与Inc()
或Dec()
一样,AtomicCmpExchange()
是使用给定平台所需的任何代码实现的。它将生成内联指令。对于x86 / x64,它将生成CMPXCHG
指令(以及将变量/值放入寄存器所需的任何设置)。对于ARM,它将围绕LDREX
和STREX
指令生成更多指令。
因此,对您的问题的直接回答是,即使调用汇编代码,您也无法比使用该标准函数以及AtomicIncrement
,AtomicDecrement
和{{1 }}