gpt4 book ai didi

c++ - 使用 C++ 原子库,我应该使用什么内存顺序进行加载,然后进行比较交换?

转载 作者:行者123 更新时间:2023-11-30 02:27:13 25 4
gpt4 key购买 nike

例如,多个线程执行 update() 函数:

// Statically allocated
atomic<int> high_water{0};
//...
void update(int meas)
{
int i;
bool replaced;
do
{
i = high_water.load(?);
if (i >= meas)
break;
replaced = high_water.compare_exchange_strong(i, meas, ?, ?);
}
while (!replaced);
// ...

(我正在尝试实现在多个线程中进行的单个测量的共享高水位线。)

最佳答案

compare_exchange_strong 相对于 high_water 是原子的,无论您为它指定什么内存顺序。内存排序仅与其他 内存操作有关。这在很大程度上取决于其他线程如何以及何时需要查看 high_water。由于 meas 仅在该线程中可见,因此无需考虑其他加载和存储。因此,memory_order_relaxed 是正确的。


作为次要说明,compare_exchange_strong 将第一个参数替换为观察到的值,因此执行该load 是多余的。

int i = high_water.load(std::memory_order_relaxed);
while (i < meas
&& high_water.compare_exchange_strong(i,
meas,
std::memory_order_relaxed,
std::memory_order_relaxed
)
)
continue;

关于c++ - 使用 C++ 原子库,我应该使用什么内存顺序进行加载,然后进行比较交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41964289/

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