当前位置:  开发笔记 > 小程序 > 正文

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

如何解决《比较并交换C中的机器代码》经验,为你挑选了2个好方法。

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

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

谢谢.



1> Crashworks..:

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

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



2> CB Bailey..:

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

例如

lock cmpxchg DWORD PTR [ebx], edx

要么

lock cmpxchgl %edx, (%ebx)

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

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有