Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493476
  • 博文数量: 72
  • 博客积分: 1851
  • 博客等级: 上尉
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 17:50
文章分类

全部博文(72)

文章存档

2013年(1)

2012年(17)

2011年(51)

2010年(3)

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

阅读(2509) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~