非破坏性原子添加
non-destructive atomic add?
如果我有一个这样的原子变量:
#include <atomic>
std::atomic<int> a = 5;
我想原子地检查(a + 4)
是否小于另一个变量,而不会覆盖a
的原始值:
if(a.something(4) < another_variable){
//Do not want a to be incremented by 4 at this point
}
我对原子fetch_and_add()
和++
进行了快速测试,它们似乎都增加了可变a
的值。有没有办法以原子方式递增进行测试,而结果不是永久性的?
if(a + 4 < another_variable) // ...
这是单个原子所能获得的最好的。您没有数据争用,因为读取原子对并发写入是安全的,并且所有后续操作都发生在原始原子值的副本上。一个更详细但功能等效的版本是:
int const copy_of_a = a.load();
if(copy_of_a + 4 < another_variable) // ...
这也是您在同步方面可以获得的最好的。您可能会担心a
可能会在另一个线程上更改为会更改if
结果的值。
假设有一个函数以原子方式执行整个操作:
if(a.plus4IsLessThan(another_variable) // ...
然后,a
的并发变化是否及时到达以改变测试结果仍然未知。在同步方面,您没有获得任何额外的保证。
如果这是程序的问题,则表明您需要更强大的同步机制。也许std::mutex
将是一个好的开始。
你可以做:
if (a + 4 < another_variable) { ...
这应该与以下相同:
if (a.load() + 4 < another_variable) { ...
根据定义(§29.6.5/16-17,此处A
"指一种原子类型"和"C
指其相应的非原子类型"):
A::operator C() const volatile noexcept;
A::operator C() const noexcept;
效果:
load()
回报:
load()
的结果
两者都不会修改a
.
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将图像添加到资源文件夹UWP C++
- 非破坏性原子添加