AtomicCmpExchange在所有平台上都可靠吗?

时间:2016-10-16 13:50:07

标签: delphi

我找不到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)未能交换该值,它是否返回“有效”整数(我的意思是,不是半读取整数,例如,如果另一个线程已经开始写入该值的一半) )?

我想避免使用临界区,我需要最大速度。

1 个答案:

答案 0 :(得分:16)

AtomicCmpExchange就是所谓的intrinsic routine, or a standard function。它本质上是编译器所知的,可能有也可能没有可见的实现。例如,Writeln是标准函数,但您无法为其找到单个实现。编译器将其分解为对System.pas中的低级函数的多次调用。某些标准函数(例如Inc()Dec())在System.pas中没有任何实现。编译器将生成相当于简单INCDEC指令的机器指令。

Inc()Dec()一样,AtomicCmpExchange()是使用给定平台所需的任何代码实现的。它将生成内联指令。对于x86 / x64,它将生成CMPXCHG指令(以及将变量/值放入寄存器所需的任何设置)。对于ARM,它将围绕LDREXSTREX指令生成更多指令。

因此,对您的问题的直接回答是,即使调用汇编代码,您也无法比使用该标准函数以及AtomicIncrementAtomicDecrement和{{1 }}