分类: C/C++
2011-10-16 16:03:39
在linux内核态中,存在原子类型来进行互斥,但在用户态却没有这个数据类型,GCC编译器提供了一些函数可以达到类似的效果(具体可以参考),现在就可以通过汇编来实现其功能,就是实现其原子的加减功能,实际上,就是在加减之前加上锁来保持互斥。代码如下:
typedef int atomic_t;
//类似gcc __sync_fetch_and_add函数
static inline atomic_t fetch_and_add(atomic_t *value,atomic_t key)
{
asm volatile("lock;addl %1,%0"
:"+m"(*value)
:"ir"(key)
:"memory");
return *value;
}
//类似gcc __sync_fetch_and_sub
static inline atomic_t fetch_and_sub(atomic_t *value,atomic_t key)
{
asm volatile("lock;subl %1,%0"
:"+m"(*value)
:"ir"(key)
:"memory");
return *value - key;
}
//类似gcc __sync_add_and_fetch函数
static inline atomic_t add_and_fetch(atomic_t *value,atomic_t key)
{
asm volatile("lock;addl %1,%0"
:"+m"(*value)
:"ir"(key)
:"memory");
return *value + key;
}
//类似gcc __sync_sub_and_fetch函数
static inline atomic_t sub_and_fetch(atomic_t *value,atomic_t key)
{
asm volatile("lock;subl %1,%0"
:"+m"(*value)
:"ir"(key)
:"memory");
return *value - key;
}
//减法之后,判读是否为0
static inline atomic_t sub_and_test(atomic_t *value,atomic_t key)
{
int c;
asm volatile("lock;subl %2,%0;sete %1"
:"+m"(*value),"=qm"(c)
:"ir"(key)
);
return c;
}
具体的测试代码见附件 atomic.rar
参考资料:
1.测试代码来自这里:
2.原子类型的内核实现在这里:
3.汇编语言简答介绍在这里