您将如何使用嵌入式机器代码(假设,例如,x86架构)在C中编写一个执行原子比较和交换整数值的函数?如果它仅针对i7处理器编写,它可以更具体吗?
翻译是作为内存栅栏,还是仅仅确保在比较和交换中包含的内存位置上的排序关系?与记忆围栏相比,它的成本是多少?
谢谢.
最简单的方法是使用像_InterlockedCompareExchange()这样的编译器内在函数.它看起来像一个函数,但实际上是编译器中的一个特殊情况,归结为单个机器操作.在MSVC x86内在的情况下,它也可用作读/写栅栏,但在其他平台上不一定如此.(例如,在PowerPC上,您需要显式发出lwsync来阻止内存重新排序.)
通常,在许多常见系统上,比较和交换操作通常仅在其触摸的一个地址上强制执行原子事务.其他内存访问可以重新排序,而在多核系统中,除了你交换的内存地址之外的内存地址可能在内核之间不一致.
您可以使用CMPXCHG
带有LOCK
前缀的指令进行原子执行.
例如
lock cmpxchg DWORD PTR [ebx], edx
要么
lock cmpxchgl %edx, (%ebx)
这将EAX寄存器中的值与存储在EBX寄存器中的地址的值进行比较,并将EDX寄存器中的值存储到该位置(如果它们相同),否则它将存储在EBX寄存器中的地址的值加载到EAX.
您需要有486或更高版本才能使用此指令.