Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 我们可以将分支预测与原子操作一起使用吗?_Linux Kernel_Atomic - Fatal编程技术网

Linux kernel 我们可以将分支预测与原子操作一起使用吗?

Linux kernel 我们可以将分支预测与原子操作一起使用吗?,linux-kernel,atomic,Linux Kernel,Atomic,我想知道我们是否可以将分支预测宏(可能/不可能)与任何原子操作一起使用。下面的陈述有什么副作用吗 atomic_t v=atomic_INIT(0); 原子能公司; 如果(不太可能(原子读取(&v))==2){ /*一些手术*/ } 在原子操作和非原子操作上使用可能/不可能没有区别。这些宏的目的只是生成在条件的两个分支之一更可能出现的情况下性能更好的代码 因此,对于“正常”操作,例如: if (unlikely(--x)) if (likely(--x)) do

我想知道我们是否可以将分支预测宏(可能/不可能)与任何原子操作一起使用。下面的陈述有什么副作用吗

atomic_t v=atomic_INIT(0);
原子能公司;
如果(不太可能(原子读取(&v))==2){
/*一些手术*/
}

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

因此,对于“正常”操作,例如:

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

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

因此,对于“正常”操作,例如:

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

“下面的陈述有什么副作用吗?”-你认为会有什么副作用?除计时外,使用
可能
/
不可能
的代码将显示与不使用该宏的代码相同的行为。在您的情况下,
不太可能
是否真的提供了更好的时机,取决于许多其他因素。和往常一样:如果不确定这些宏的好处,那么就不要使用它们。“下面的语句有任何副作用吗?”-您预期会有什么副作用?除计时外,使用
可能
/
不可能
的代码将显示与不使用该宏的代码相同的行为。在您的情况下,
不太可能
是否真的提供了更好的时机,取决于许多其他因素。与往常一样:如果不确定好处,则不要使用这些宏。