- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找不到AtomicCmpExchange
的实现(似乎是隐藏的),所以我不知道它是做什么的。
AtomicCmpExchange
在所有平台上都可靠吗?内部是如何实现的?它使用类似关键部分的东西吗?
我有这样的场景:
主线程:
Target := 1;
主题1:
x := AtomicCmpExchange(Target, 0, 0);
线程2:
Target := 2;
线程3:
Target := 3;
x
总是整数 1、2 或 3,还是其他值?我的意思是,即使 AtomicCmpExchange(Target, 0, 0)
未能交换值,它是否返回一个“有效”整数(我的意思是,不是半读整数,例如,如果另一个线程已经开始写入该值的一半)?
我想避免使用关键部分,我需要最大速度。
最佳答案
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
等)更高效。 > 和 AtomicExchange
。
关于delphi - AtomicCmpExchange 在所有平台上都可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40071010/
如果你创建一个新的多设备应用项目,设置Project > Option > Compiling > Optimization : True , 然后将下面的代码复制到 unit1.pas : unit
我找不到AtomicCmpExchange的实现(似乎是隐藏的),所以我不知道它是做什么的。 AtomicCmpExchange 在所有平台上都可靠吗?内部是如何实现的?它使用类似关键部分的东西吗?
我是一名优秀的程序员,十分优秀!