当前位置: 技术问答>linux和unix
原子操作的问题
来源: 互联网 发布时间:2015-04-13
本文导语: 我想在用户空间执行原子操作,请问给如何实现啊? | 不知道你是用什么CPU?UNP还是SMP?IA还是别的体系? 上边你列出的就是SysV IPC的信号量,也算是原子操作吧。 你说的原子操作也很含糊...
我想在用户空间执行原子操作,请问给如何实现啊?
|
不知道你是用什么CPU?UNP还是SMP?IA还是别的体系?
上边你列出的就是SysV IPC的信号量,也算是原子操作吧。
你说的原子操作也很含糊,你是想把一个数加到另一个变量上,一次性完成,所以不想用信号量还是别的?我不知道lock指令在80x86上算不算特权指令,如果不是的话,你在用户态SMP也是可以使用的。
以下是内核源代码:
#ifdef CONFIG_SMP
#define LOCK "lock ; "
#else
#define LOCK ""
#endif
typedef struct { volatile int counter; } atomic_t;
#define ATOMIC_INIT(i) { (i) }
#define atomic_read(v) ((v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
static __inline__ void atomic_add(int i, atomic_t *v)
{
__asm__ __volatile__(
LOCK "addl %1,%0"
:"=m" (v->counter)
:"ir" (i), "m" (v->counter));
}
感觉这个函数在80x86 UNP 上和 n += i;没有什么区别,只是用__volatile__来拒绝编译器的优化,但是在SMP上多了一个lock指令。
上边你列出的就是SysV IPC的信号量,也算是原子操作吧。
你说的原子操作也很含糊,你是想把一个数加到另一个变量上,一次性完成,所以不想用信号量还是别的?我不知道lock指令在80x86上算不算特权指令,如果不是的话,你在用户态SMP也是可以使用的。
以下是内核源代码:
#ifdef CONFIG_SMP
#define LOCK "lock ; "
#else
#define LOCK ""
#endif
typedef struct { volatile int counter; } atomic_t;
#define ATOMIC_INIT(i) { (i) }
#define atomic_read(v) ((v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
static __inline__ void atomic_add(int i, atomic_t *v)
{
__asm__ __volatile__(
LOCK "addl %1,%0"
:"=m" (v->counter)
:"ir" (i), "m" (v->counter));
}
感觉这个函数在80x86 UNP 上和 n += i;没有什么区别,只是用__volatile__来拒绝编译器的优化,但是在SMP上多了一个lock指令。