原子数据类型的实现

2589阅读 0评论2011-10-16 datao0907
分类:C/C++

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.汇编语言简答介绍在这里

上一篇:gcc内联汇编学习笔记
下一篇:进程与信号(一)