gpt4 book ai didi

c++ - 内存障碍,不确定我是否可以轻松使用?

转载 作者:行者123 更新时间:2023-11-30 03:51:17 26 4
gpt4 key购买 nike

使用伪代码,我有两个线程都试图首先访问并“弹出”相同的数据:

线程1

DataBlock db = memoryLocationX.reserveBlock();

线程2

DataBlock anotherDB = memoryLocationX.reserveBlock();

reserveBlock()对内存执行std::exchange(),返回原始值并替换为空白值,因此只有一个线程可以获取数据:

DataBlock reserveBlock(){
return DataBlock(_internalState.exchange(EMPTY_VALUE));
}

我的问题是,在什么情况下我可以使用 std::memory_order_relaxed 作为 exchange() 的第二个参数?我试图确保只有一个线程检索存储在 _internalState 中的数据。但这已经通过 exchange() 实现了,所以这是否意味着我可以使用 std::memory_order_relaxed

最佳答案

对于 std::memory_order_relaxed,您无法得到任何保证,只是不会出现数据竞争。它避免了未定义的行为,但它在少数情况下真正有用(例如,如果您可以通过其他方式保证同步)。

在您的示例中,您需要在线程之间进行同步,因此如果您使用宽松的语义,您仍然需要显式同步。否则,不能保证其他线程看到修改。

最终,它很可能不会更快,代码会更复杂。

关于c++ - 内存障碍,不确定我是否可以轻松使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357489/

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