gpt4 book ai didi

c++ - 这个 fetch_mult 的原子实现是否正确?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:32 25 4
gpt4 key购买 nike

This site解释 C++11 原子并给出一个原子 fetch_mult 的示例实现默认不提供的操作std::atomic<T>类型:

#include <atomic>
#include <iostream>

template <typename T>
T fetch_mult(std::atomic<T>& shared, T mult){
T oldValue= shared.load();
// 1
while (!shared.compare_exchange_strong(oldValue, oldValue * mult));
return oldValue;
}

int main(){
std::atomic<int> myInt{5};
std::cout << myInt << std::endl;
fetch_mult(myInt,5);
std::cout << myInt << std::endl;
}

我无法理解这个函数。如果fetch_mult// 1 点中断通过另一个也调用 fetch_mult 的线程,自 compare_exchange_strong 以来线程之一不会死锁吗?永远不会回来true除非 mult==1或者另一个线程将值设置回 oldValue

例如(T1 和 T2 是各自的线程):

  • T1:oldValue = 5;
  • T2:oldValue = 5;
  • T2:compare_exchange_strong成功将值设置为 25
  • T1:compare_exchange_strongoldValue 以来从未成功完成还是5除非其他人将值设置为 5再次

我的理解对吗?如果是这样,这是否是 fetch_mult 的正确实现? ?

template <typename T>
T fetch_mult(std::atomic<T>& shared, T mult){
while (true) {
T oldValue = shared.load();
if (shared.compare_exchange_strong(oldValue, oldValue * mult))
return oldValue;
}
}

最佳答案

如果比较失败,

atomic::compare_exchange_* 将当前值加载到“expected”参数中。在您的示例中,在步骤 4 中,T1 将使比较交换失败并将 25 加载到 oldValue 中,然后在下一次迭代中成功。

关于c++ - 这个 fetch_mult 的原子实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57722059/

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