c++ - 如何以原子方式递增或递减非 std::atomic 整数类型
问题描述
所以在 C++ 中,假设我有以下 16 字节类型,它可以在具有cmpxchg16b
指令的 CPU 上进行原子操作:
#include <atomic>
#include <cstdio>
struct foo
{
size_t _x;
void* _y;
foo(size_t x = 3, void* y = nullptr): _x(x), _y(y){}
};
int main()
{
std::atomic<foo> f1;
foo f2;
foo f3(2, new int(4));
f1.compare_exchange_strong(f2, f3);
std::printf("is always lock free %s\n", std::atomic<foo>::is_always_lock_free ? "true" : "false" );
}
但是,假设我可能只想在 上进行原子增量_x
,例如 via fetch_add
。我如何在不必使用的情况下应用这样的原子操作std::atomic<size_t>
?我不想在这里使用它的原因是因为较大的foo
类型变得不可轻易复制,并阻止我使用 16 字节的比较和交换,给出以下错误:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/atomic:923:3: error:
_Atomic cannot be applied to type 'foo' which is not trivially copyable
_Atomic(_Tp) __a_value;
所以我正在寻找一种方法来做类似的事情,
foo a1;
fetch_add(&a1._x);
解决方案
推荐阅读
- python - 在不同的 CPU 中运行不同的 Python 函数
- excel - 复制大于零的单元格,并将值粘贴到同一单元格中
- amp-html - 如何避免 AMP 网站上的重复代码?
- python - 抓取多个网页,结果输出乱序
- c - 基于计数排序的问题中的 SIGSEGV 错误
- xcode - 自定义字体未显示在我的开发窗格中
- python - tcp server 结合 Python3.7 asyncio 和 multiprocess
- amazon-web-services - 安全组和网络接口出现 AWS CloudFormation 错误,参数组合无效
- sql-server - 结合表数据和历史表
- c# - 使用多租户缓存用户数据