在新的标准 C++ 原子增量操作中,在增量值之前是否具有检查前提条件,即原子值小于指定值?
我能比下面的代码更容易、更快吗?
int atomic_inc(std::atomic_int& val, int less_than) {
int new_val;
int old_val = val.load();
do
{
if (old_val > less_than) return old_val;
new_val = old_val + 1;
} while (!val.compare_exchange_weak(old_val, new_val));
return new_val;
}
如果有人不知道 compare_exchange_weak 是如何工作的: compare_exchange_weak 读取 val,与 old_val 比较,如果不相等则将 val 保存到 old_val。如果相等则将 new_val 保存到 val。
最佳答案
我过去做过的一些事情,可能对你有用,这取决于你使用它的目的。
如果您可以假设 val
不会经常裁剪——因此不执行 CAS 的可能优化不会为您节省很多——您可以盲目地递增阅读后调整该值:
int atomic_inc(std::atomic_int& val, int less_than) {
return std::min(++val, less_than);
}
然后如果需要,偶尔将 val
回落到 less_than
,通常足以让您不必担心 int
溢出, 你是金色的。
关于c++ - 是否有检查前提条件的原子增量,即原子值小于指定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778110/