作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想比较和交换 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;
}
我的代码正确吗?或者有更好的方法吗?
最佳答案
您重写的函数仍然会给出不一致的结果。如果在将 expected
加载到 newExpectedValue
之后,但在检查 newExpectedValue == expectedValue
之前,它发生了变化怎么办?如果 new
和 expected
在加载 expected
之后但在 new
之前发生变化怎么办?
这不是打算使用原子的方式。如果您需要以原子方式执行涉及三个变量的操作,您应该在操作期间使用锁来序列化访问。互斥锁或自旋锁在这里更合适。
关于c++ - 三个原子变量上的 CompareAndExchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19604456/
我想比较和交换 3 个原子变量: std::atomic a; std::atomic expected; std::atomic new; int expectedValue = std::atom
这是 Java 库的一个片段: public final boolean compareAndExchangeAcquire(boolean expectedValue, boolean newVal
我是一名优秀的程序员,十分优秀!