我找不到AtomicCmpExchange(似乎隐藏)的实现,所以我不知道它的作用.
是AtomicCmpExchange在所有平台上可靠吗?它是如何在内部实施的?它是否使用类似临界区的东西?
我有这种情况:
MainThread:
Target := 1;
Run Code Online (Sandbox Code Playgroud)
线程1:
x := AtomicCmpExchange(Target, 0, 0);
Run Code Online (Sandbox Code Playgroud)
线程2:
Target := 2;
Run Code Online (Sandbox Code Playgroud)
Thread3:
Target := 3;
Run Code Online (Sandbox Code Playgroud)
将x永远是一个整数1,2或3,或可能是别的东西吗?我的意思是,即使AtomicCmpExchange(Target, 0, 0)未能交换该值,它是否返回一个"有效"整数(我的意思是,不是半读取整数,例如,如果另一个线程已经开始写入该值的一半)?
我想避免使用临界区,我需要最大速度.
All*_*uer 16
AtomicCmpExchange是所谓的内在例程或标准函数.它本质上是编译器所知的,可能有也可能没有可见的实现.例如,Writeln是标准函数,但您不会找到它的单个实现.编译器将其分解为对System.pas中的低级函数的多次调用.一些标准功能,如Inc()和Dec()不具备任何System.pas执行.编译器将生成相当于简单INC或DEC指令的机器指令.
喜欢Inc()或者Dec(),AtomicCmpExchange()使用给定平台所需的任何代码来实现.它将生成内联指令.对于x86/x64,它将生成一条CMPXCHG指令(以及将变量/值放入寄存器所需的任何设置).对于ARM,它将围绕LDREX和STREX指令生成更多指令.
所以直接回答你的问题是,即使调入汇编代码,你不能得到更有效的利用相比,与其他如沿着标准功能AtomicIncrement,AtomicDecrement以及AtomicExchange.
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |