C++增量 std::atomic_int 如果为非零
C++ increment std::atomic_int if nonzero
我正在使用std::atomic
s作为参考计数器实现指针/弱指针机制(像这样)。为了将弱指针转换为强指针,我需要原子方式
- 检查强引用计数器是否不为零
- 如果是这样,请递增它
- 知道是否有某些事情发生了变化。
有没有办法使用 std::atomic_int
来做到这一点?我认为必须可以使用其中一种compare_exchange
,但我无法弄清楚。
给定定义std::atomic<int> ref_count;
int previous = ref_count.load();
for (;;)
{
if (previous == 0)
break;
if (ref_count.compare_exchange_weak(previous, previous + 1))
break;
}
previous
将保留以前的值。请注意,如果失败,compare_exchange_weak
将更新以前的版本。
这应该可以做到:
bool increment_if_non_zero(std::atomic<int>& i) {
int expected = i.load();
int to_be_loaded = expected;
do {
if(expected == 0) {
to_be_loaded = expected;
}
else {
to_be_loaded = expected + 1;
}
} while(!i.compare_exchange_weak(expected, to_be_loaded));
return expected;
}
相关文章:
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 如果 x < 10,则添加前导 0 并将其存储为 int
- 在C++中,如果"int a = 3; int* p = &a;",那么为什么不允许"const int* &pp = p",但允许"const int* const &pp = p"?
- 如果char可以在C++中存储数字,为什么我们需要int
- 如果我在 C++ 中为 int 提供双精度,输入缓冲区中存储了什么?
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?
- “std::p ow(double, int)”比“std::p ow(double, double)”快吗?如果是,快
- 如果用户在 int 中输入字符,如何使用输入
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 如果可以将其放在私有中,为什么要使用静态常量(int/string/.)?
- 如果没有未定义的行为 [c++],哪些浮点值无法转换为 int?
- 如果我将无符号 int 分配给有符号的 int,是否可以有单位化位
- 我的 c++ 程序不打印任何字符,但是如果我将它们更改为 int,代码可以完美运行
- 为什么如果(!(cin >> int)) 在第一次迭代中接受十进制数,但不接受其他十进制数?
- 在int到char转换期间,int将在char中存储在char中,如果int太大,将在char中存储的值
- 如果int *a = *b,将指向b引用的对象
- 如果int是数字c++,则测试将其转换为char