首页 > 解决方案 > 我们可以将分支预测与原子操作一起使用吗?

问题描述

我想知道我们是否可以将分支预测宏(可能/不太可能)与任何原子操作一起使用。以下语句有副作用吗?

atomic_t v = ATOMIC_INIT(0);
atomic_inc(&v);
if (unlikely(atomic_read(&v)) == 2) {
  /* Some Operation */
}

标签: linux-kernelatomic

解决方案


在原子操作和非原子操作上使用likely/没有区别。unlikely这些宏的目的只是生成在条件的两个分支之一更有可能的情况下执行更好的代码。

因此,对于“正常”操作,您将拥有例如:

if (unlikely(--x))              if (likely(--x))
    do_a();                         do_a();
else                            else
    do_b();                         do_b();


    *decrement x*                   *decrement x*
    jnz not_zero                    jz zero
    call do_b                       call do_a
not_zero:                       zero:
    call do_a                       call do_b

而在原子操作的情况下,您只需:

if (unlikely(atomic_sub_and_test(&x)))   if (likely(atomic_sub_and_test(&x)))
    do_a();                                  do_a();
else                                     else
    do_b();                                  do_b();
                          
                          
    *atomically decrement x*                 *atomically decrement x*
    jnz not_zero                             jz zero
    call do_b                                call do_a
not_zero:                                zero:
    call do_a                                call do_b

推荐阅读