atomic_add_unless小记

atomic_add_unless函数的实现在arch/arm/include/asm/atomic.h中

作用是将新值存入atomic_t类型的变量,并把变量的旧值返回,函数事先如下。

static inline int atomic_add_unless(atomic_t *v, int a, int u)
{
	int c, old;

	c = atomic_read(v);
	while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c)
		c = old;
	return c != u;
}

函数会事先判断第二个参数是否与传入atomic_t中的值是否相同,如果不同的话需要把a和传入的atiomi_t的值相加。

由于cmpxchg函数可能并不会交换成功,所以需要反复检查是否存入并执行cmpxcg函数。函数返回想加前的值是否等于u。

static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
{
	int ret;
	unsigned long flags;

	raw_local_irq_save(flags);
	ret = v->counter;
	if (likely(ret == old))
		v->counter = new;
	raw_local_irq_restore(flags);

	return ret;
}
atomic_cmpxchg需要传入三个参数,当old与v相同的时候才把新的取值传入,并返回之前的取值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值