![](/img/trans.png)
[英]How to implement atomic compare and swap using 'cmpxchg8b' assembly instruction in c?
[英]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.