gpt4 book ai didi

c++ - 对共享变量执行多个原子操作

转载 作者:太空狗 更新时间:2023-10-29 21:02:33 25 4
gpt4 key购买 nike

我想对一个共享变量做两个操作。我需要保证它可以原子地完成。有人可以帮助我澄清以下方法是否正确:

#include <atomic>
std::atomic<int> index;

void function()
{
// I need the variable index to be incremented but bound in the
// range of [0,9].
int loc_indx = index.load(std::memory_order_acquire);
index.store( (loc_indx+1)%10 , std::memory_order_release);
}

根据我的理解,索引存储操作和索引加载操作必须一起发生。这里的一些专家能否澄清上面的代码是否等同于以下伪代码:

ATOMIC
{
index = (index+1)%10;
}

我一直在 Visual Studio 2012 的 c++ 部分或/和 1.53 的 boost::atomic 部分使用原子包。

最佳答案

与锁相比,原子的全部目的是 boost 性能。

您的代码中没有锁。 memory_order 枚举只是为了确保编译器不会重新排序代码(也不会让 CPU 重新排序)。这意味着其他线程修改 loadstore 之间的值的可能性很小。如果存储的值必须依赖于之前的值,那么中间所做的计算就被浪费了,需要重做。这样做比锁定更有效,因为并发修改实际发生的可能性很低,而且计算成本低且简单。

当你知道之前的值时存储,否则重新计算并重试。像这样的东西:

 int loc_index = index.load(std::memory_order_acquire);
int desired = (loc_index+1)%10;

while ( !index.compare_exchange_strong( loc_index, desired ) )
{
desired = (loc_index+1)%10;
}

compare_exchange_strong 是原子操作,比较存储在indexloc_index中的值;如果它们相等,则将 desired 存储到 index 中;如果它们不相等,它会将 index 的值复制到 loc_index 中。这可以帮助您确保下一个index 中存储的值是正确的。

关于c++ - 对共享变量执行多个原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119748/

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