比较并交换C中的机器代码

axe*_*l22 10 c x86 multithreading compare-and-swap

您将如何使用嵌入式机器代码(假设,例如,x86架构)在C中编写一个执行原子比较和交换整数值的函数?如果它仅针对i7处理器编写,它可以更具体吗?

翻译是作为内存栅栏,还是仅仅确保在比较和交换中包含的内存位置上的排序关系?与记忆围栏相比,它的成本是多少?

谢谢.

Cra*_*rks 7

最简单的方法是使用像_InterlockedCompareExchange()这样的编译器内在函数.它看起来像一个函数,但实际上是编译器中的一个特殊情况,归结为单个机器操作.在MSVC x86内在的情况下,它也可用作读/写栅栏,但在其他平台上不一定如此.(例如,在PowerPC上,您需要显式发出lwsync阻止内存重新排序.)

通常,在许多常见系统上,比较和交换操作通常仅在其触摸的一个地址上强制执行原子事务.其他内存访问可以重新排序,而在多核系统中,除了你交换的内存地址之外的内存地址可能在内核之间不一致.


CB *_*ley 7

您可以使用CMPXCHG带有LOCK前缀的指令进行原子执行.

例如

lock cmpxchg DWORD PTR [ebx], edx
Run Code Online (Sandbox Code Playgroud)

要么

lock cmpxchgl %edx, (%ebx)
Run Code Online (Sandbox Code Playgroud)

这将EAX寄存器中的值与存储在EBX寄存器中的地址的值进行比较,并将EDX寄存器中的值存储到该位置(如果它们相同),否则它将存储在EBX寄存器中的地址的值加载到EAX.

您需要有486或更高版本才能使用此指令.