gpt4 book ai didi

c++ - 在运行时检测负载是否是原子的?

转载 作者:行者123 更新时间:2023-11-30 05:45:49 25 4
gpt4 key购买 nike

我的应用程序需要几个原子加载和存储。不幸的是,这些操作必须发生在内存映射文件中的特定地址,所以我不能使用 c++11 的 std::atomic (因为 std::atomic 通过控制变量的大小和对齐/位置来工作。因为我控制内存映射文件格式,我们只在一个 CPU 架构上运行

有没有一种方法可以测试(在运行时)对特定地址的特定大小的读取或写入是否是原子的?我的主要平台是 x86-64,但我也对 ARM 的解决方案感兴趣。

最佳答案

简短回答:可能不会。您可以编写一些代码来更新和检查您的值的有效性,并运行 6 个月。然而,它几乎肯定不能保证代码是正确的 - 只是你没有找到正确的地方让它出错。

长答案:处理器字的加载和存储本身几乎肯定是原子的,但是 std::atomic 功能提供了比这更强的保证。它保证没有处理器会使用“陈旧”的值(缓存一致性和独占更新)。如果没有 std::atomic,您将无法做出同样的保证(除非平台本身保证这一点,这可能要求它至少是一个单核处理器)。

在一般情况下,处理器执行的加载和存储具有“弱”缓存一致性和原子更新策略。假设我们有这段代码:

 int a = 42; 
bool flag = false;

...

a++;
flag = true;

和一些其他的代码:

 while(!flag)
a--;

[我目前忽略了一个事实,即 flag 也需要原子更新策略并且可能需要是易变的——这不是本例的重点]

不能保证编译器不会形成tmp = a; tmp = tmp+1; a = tmp;(对应于 a--)[为了更好地衡量,可能会在两者之间添加额外的指令,因为编译器希望它以其他方式更快/更好].

也不能保证该值不会更新为43,但其他代码在退出循环后读取了旧的42值,因为flag 为真(因为处理器没有完全按照您期望的顺序执行所有操作,并且缓存内容“乱序”更新)。

x86 处理器肯定属于无法保证更新值将立即可用的处理器,如上所述。缓存一致性和原子性只是保证你不会读取一些“半生不熟”的值——更新值时它要么是“旧”值,要么是"new"值——但它可能在相当长的一段时间内都是“旧”值在写入"new"值之后,这通常“不是一件好事”。

关于c++ - 在运行时检测负载是否是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29222214/

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