c++ - 是否有检查前提条件的原子增量,即原子值小于指定值?

标签 c++ c++11 atomic atomic-swap stdatomic

在新的标准 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/

相关文章:

c++ - "Updating"文件中的一行被覆盖

c++ - 从 C++ 执行命令,argv[0] 中预期的是什么?

c++ - shared_ptr 模板参数无效

c++ - c中的指针是普通变量还是比这个多

c++ - 如何根据单个用户定义的文字自动添加文字定义?

c++ - 使用自动成员函数调试符号错误的解决方法?

c++ - 访问私有(private)嵌套类

MySQL 更新导致列值在查询中途更改

multithreading - pthreads v。SSE弱内存排序

c++ - memory_order_relaxed 是否尊重同一线程内的数据依赖性?