gpt4 book ai didi

c++ - std::atomic 将一对原子 int32 视为一个原子 int64?

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

我有一对unsigned int32

std::atomic<u32> _start;
std::atomic<u32> _end;

有时我想通过比较交换来设置开始或结束,所以我不希望在整个 64 位对上使用 CAS 可能导致虚假故障。我只想使用 32 位 CAS。

_end.compare_exchange_strong(old_end, new_end);

现在我可以将开始和结束作为一个 64 位原子读取来获取。或者两个单独的 32 位读取。执行一次 64 位原子提取(编译器添加适当的内存栅栏)而不是使用两个内存栅栏进行两次单独的 32 原子位读取(或者编译器会优化它吗?)会不会更快?

如果是这样,我将如何在 C++11 中做到这一点?

最佳答案

标准不保证 std::atomics具有与基础类型相同的大小,也不是 atomic 上的操作是无锁的(尽管它们可能至少适用于 uint32)。因此,我很确定没有任何一致的方法可以将它们组合成一个 64bit原子操作。因此,您需要决定是否要手动将这两个变量组合成一个 64 位变量(并且仅适用于 64 位操作)。

例如,平台可能不支持 64bit CAS(对于第一个 Pentium IIRC 添加的 x86,因此在编译 486 兼容时它不可用。在这种情况下,它需要以某种方式锁定,因此原子可能同时包含 64bit 变量和锁。

关于围栏:这取决于 memory_order您为您的操作指定。如果内存顺序指定这两个操作需要按照它们执行的顺序可见,编译器显然无法优化栅栏,否则它可能。当然假设你只针对 x86 memory_order_seq_cst实际上会根据我的内存发出一个障碍指令,所以任何少的东西都会阻碍编译器完成的指令重新排序,但不会有实际的惩罚)。

当然,根据您的平台,您可能会处理两个 std::atomic<int32>作为int64之一通过 union 进行类型转换或 reinterpret_cast , 请注意,标准不需要此行为,并且可以(至少理论上)随时停止工作(新的编译器版本、不同的优化设置,...)

关于c++ - std::atomic 将一对原子 int32 视为一个原子 int64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8858387/

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