最近想用NDK实现一个多线程版的智能指针自己用,结果发现在NDK应用层无法使用内核类的原子操作函数~也无法去指定对应的CPU去调用Linux原子操作函数,毕竟手机的cpu千奇百怪。。。
最后查了半天文档发现原来在sys/atomics.h中,简单定义了一些原子操作,文档见 ANDROID ATOMICS OPERATIONS
1. 自加操作
__ATOMIC_INLINE__ int
__atomic_inc(volatile int *ptr)
{
return __sync_fetch_and_add (ptr, 1);
}
将ptr指向的值加一,返回原来的值,我的时NDKR9 他自己调用了linux的原子函数。。。
2. 自减操作
__ATOMIC_INLINE__ int
__atomic_dec(volatile int *ptr)
{
return __sync_fetch_and_sub (ptr, 1);
}
同上相当于i-- ,再次吐槽他自己调linux函数。。。
3. 赋值
__ATOMIC_INLINE__ int
__atomic_swap(int _new, volatile int *ptr)
{
int prev;
do {
prev = *ptr;
} while (__sync_val_compare_and_swap(ptr, prev, _new) != prev);
return prev;
}
将 _new 的值赋给指向的地址,do{}while是为了防止当赋值操作结束后ptr指向的值再次变化,
实际上调用的Linux上的比较赋值。。。
4. 比较赋值
__ATOMIC_INLINE__ int
__atomic_cmpxchg(int old, int _new, volatile int *ptr)
{
/* We must return 0 on success */
return __sync_val_compare_and_swap(ptr, old, _new) != old;
}
__sync_val_compare_and_swap 函数的意思是, 当 *ptr == old 时 *ptr = _new 函数的返回值一定是ptr的原值,所以__atomic_cmpxchg函数的返回值为 当 *ptr == old 时 返回0 否则返回 1
另附上一个讲解Linux原子操作的文章