c - 如何实现atomic_min?

标签 c linux-kernel atomic compare-and-swap

我需要实现一个 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 别无选择。 .

关于c - 如何实现atomic_min?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40127017/

相关文章:

c - __atomic_exchange_n 上的神秘 "value computed is not used"警告

c++ - 如何提取并检查数组元素中的第一个字符是否是字母

linux - 分析系统调用

c++ - 从 C++ 中的函数返回二维数组

linux-kernel - 编译内核后设备树二进制文件在哪里

linux-kernel - 将 mmap 内核引导参数保留的内存映射到用户空间

Django:原子事务中的对象创建

Golang : when there's only one writer change the value using atomic. StoreInt32, 多个读卡器中是否需要使用atomic.LoadInt32?

c - C 中的变量不显示?

C 编程 - 反转字符串