比较和交换三个原子变量
CompareAndExchange On Three atomic variable
我想比较和交换 3 个原子变量:
std::atomic<int> a;
std::atomic<int> expected;
std::atomic<int> new;
int expectedValue = std::atomic_load_explicit(&expected, std::memory_order_relaxed);
int newValue = std::atomic_load_explicit(&new, std::memory_order_relaxed);
std::atomic_compare_exchange_strong_explicit(
&a,
&expectedValue,
newValue,
std::memory_order_relaxed,
std::memory_order_relaxed);
但是,如果在读取expected
和new
变量并将它们与a
进行比较之间,另一个线程更改了它们的值,则当前线程将按以前的值工作,因此我将代码更改为它:
while(true)
{
int expectedValue = std::atomic_load_explicit(&expected, std::memory_order_relaxed);
int newValue = std::atomic_load_explicit(&new, std::memory_order_relaxed);
std::atomic_compare_exchange_strong_explicit(
&a,
&expectedValue,
newValue,
std::memory_order_relaxed,
std::memory_order_relaxed);
int newExpectedValue = std::atomic_load_explicit(&expected, std::memory_order_relaxed);
int newNewValue = std::atomic_load_explicit(&new, std::memory_order_relaxed);
if(newExpectedValue == expectedValue && newNewValue == newValue)
break;
}
我的代码正确吗?或者有更好的方法可以做到这一点吗?
重写的函数仍可能给出不一致的结果。如果在将其加载到 newExpectedValue
后但在检查是否newExpectedValue == expectedValue
之前expected
更改怎么办?如果在加载expected
后但在new
之前更改new
和expected
怎么办?
这不是原子学的使用方式。如果需要以原子方式执行涉及三个变量的操作,则应在操作期间使用锁来序列化访问。互斥锁或旋转锁在这里更合适。
为什么expected
和new
首先是原子的? 通常,您在某个线程上以某种方式计算新值,只有该线程知道新值并执行compare_exchange。 同样,expected
的值是该线程开始计算之前的旧值 - 但预期的旧值再次仅对那一个线程很重要。
简而言之:expected
和new
不应跨线程共享。
相关文章:
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 声明 2 个变量
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 我有三个 getline,但是一旦编译,输入就太多了
- 为什么将三个变量与 == 一起比较会计算为 false?
- 访问三个不同的变量在C++中形成三个不同函数中的一个文件
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 在C 中的三个布尔变量之间切换
- 从文本文件中读取并保存为两个或三个变量
- 比较和交换三个原子变量
- 如何组合三个变量以使用提升 asio 发送
- 在不使用第三个变量作为中间位置的情况下交换两个变量
- 为什么我可以在一个文件中无序地初始化两个静态类变量,而不能初始化三个
- 在不使用第三个变量的情况下交换两个变量的值——数组
- 将三个字符串变量放入一个数组中
- 如果存在三个变量,则使用范围解析操作符
- 与c++中priority_queue中的第三个变量的比较