gpt4 book ai didi

c++ - 三个原子变量上的 CompareAndExchange

转载 作者:行者123 更新时间:2023-11-30 01:56:37 27 4
gpt4 key购买 nike

我想比较和交换 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);

但是如果在读取 expectednew 变量并将它们与 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 之前,它发生了变化怎么办?如果 newexpected 在加载 expected 之后但在 new 之前发生变化怎么办?

这不是打算使用原子的方式。如果您需要以原子方式执行涉及三个变量的操作,您应该在操作期间使用锁来序列化访问。互斥锁或自旋锁在这里更合适。

关于c++ - 三个原子变量上的 CompareAndExchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19604456/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com