繁体   English   中英

如何实现atomic_min?

[英]How to implement atomic_min?

我需要实现一个atomic_min函数,该函数等效于:

static void atomic_min(u64 *ptr, u64 value)                                        
{
    enter critical section
    *ptr = min(*ptr, value);
    exit critical section                                                                               
}

这可以使用cmpxchg实现:

static void atomic_min(u64 *ptr, u64 value)                                        
{                                                                                
    u64 old, new;                                                            
    do {                                                                     
        old = *ptr;                                                        
        new = min(old, value);                                           
    } while (cmpxchg(ptr, old, new) != old);
}

在我看来这效率很低。 有没有更好的方法来实现atomic_min

架构提供的原子算术指令主要受加/减和按位运算的限制。 (至少,Linux内核仅提供与拱无关的代码的那些操作)。

因为min不能通过加法,减法或按位运算来表示,所以对于实现“ atomic_min”,除了使用cmpxchg之外别无选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM