gpt4 book ai didi

c - 如何基于Linux GCC用汇编语言实现__sync_fetch_and_sub原子操作

转载 作者:太空狗 更新时间:2023-10-29 11:46:04 25 4
gpt4 key购买 nike

我需要在没有__sync_fetch_and_sub 内置函数的GCC 3.4 汇编语言中自己编写__sync_fetch_and_sub 原子操作的实现。但是我对汇编知之甚少。

谁能帮帮我?任何帮助将不胜感激!!

这里是__sync_fetch_and_add的实现

inline unsigned int __sync_fetch_and_add(volatile unsigned int* p, unsigned int incr)
{

unsigned int result;
__asm__ _volatile_ ("lock; xadd %0, %1" :
"=r"(result), "=m"(*p):
"0"(incr), "m"(*p) :
"memory");
return result;
}

__sync_fetch_and_add(int *ptr, int a_count) 是原子地把a_count加到ptr指向的变量上。返回之前在内存中的值。

__sync_fetch_and_sub(int *ptr, int a_count)是原子地从ptr指向的变量中减去a_count。返回之前在内存中的值。

最佳答案

此代码段使用 xadd 的原子版本:exchange 和 add:它以原子方式将右操作数添加到左侧(此处为内存),并在右操作数中返回内存中的初始值。 lock语句保证操作的原子性。

但是,gcc 使用的是 AT&T 符号,所以这个解释中的左右参数(取自 intel 手册)是颠倒的。

由于在英特尔架构上没有xsub指令,模拟这个最简单的方法是首先取你想要减去的数字的相反数,然后自动添加/交换它:

inline unsigned int __sync_fetch_and_sub(volatile unsigned int* p,
unsigned int decr)
{
unsigned int result;

__asm__ __volatile__ ("lock; xadd %0, %1"
:"=r"(result), "=m"(*p)
:"0"(-decr), "m"(*p)
:"memory");
return result;
}

我还删除了 unsigned 属性,我发现它们与这种情况无关。

关于c - 如何基于Linux GCC用汇编语言实现__sync_fetch_and_sub原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com