gpt4 book ai didi

c++ - 原子商店。结构

转载 作者:行者123 更新时间:2023-11-28 00:01:39 26 4
gpt4 key购买 nike

我编译并分析了汇编输出:

struct S{
public:
int a,b,c,d,e,f,g,h,i,j,k;
};

int main() {
S s;
std::atomic<S> as;
as.store(s);
return 0;
}

我想看看它实际上是如何实现 atomic store 的。当涉及对齐的“小”操作数时,这很容易。但是,现在我们有一个更广泛的操作数,所以情况更复杂了。

在我的另一个问题 ( Atomicity on x86 ) @Peter Cordes 中说:

For wider operands, like atomically writing new data into multiple entries of a struct, you need to protect it with a lock which all accesses to it respect. (You may be able to use x86 lock cmpxchg16b with a retry loop to do an atomic 16b store. Note that there's no way to emulate it without a lock.)

好的,但这到底是什么意思呢?锁定是什么意思?特别是,我知道 lock 是一个前缀,可以确保“前缀”指令的原子性。特别是,@Peter Cordes 说:

You may be able to use x86 lock cmpxchg16b with a retry loop to do an atomic 16b store

我不明白如何让它保持原子性?好的,我可以想象 16B 的内存块可以以原子方式存储吗?但是下一次迭代呢?

我希望我的疑惑是可以理解的,因为我在表达时遇到了问题。


我正在调试上面的程序,在我看来,魔法就在 atomic_store 背后。我想这个函数执行@Peter Cordes 所说的。如果有人想要,我可以在这里粘贴反汇编的 __atomic_store

最佳答案

You may be able to use x86 lock cmpxchg16b with a retry loop to do an atomic 16B store

我真的说的是 16b 而不是 16B 吗?哎呀。我会在更大规模的修改中解决这个问题。

这让您可以执行一个 16B 原子存储,但将其作为读取-修改-重写来执行,不断重试直到比较部分成功。您不能使用它以原子方式存储超过 16B。


What does it mean to lock? Especially, I know that lock is a prefix that ensures about atomicity of "prefixed" instruction.

像自旋锁/互斥锁一样锁定,而不是 lock字首。 lock前缀仅适用于读-修改-写指令;没有lock mov [mem], eax做一个原子未对齐的商店或什么的。 lock ed 总线周期总是读取-修改-写入,正如英特尔在 cmpxchg 的文档中所记录的那样.所以一个lock mov store 还会生成一个负载,如果您在内存映射 I/O 上使用它,它具有不同的语义。 (读取可能会引发副作用)。


I've compiled and analyzed the assembly output for ...

为什么要将代码放在 main() 中? , 并存储来自 s 的未初始化垃圾进入as ?除此之外,main在某些方面很特别。最好只编写一个带参数的函数(或只影响全局)。和 atomic<s>需要是全局性的,而不是可能被部分优化掉的局部性,如果你想确保你看到 gcc“真正”做了什么。

#include <atomic>
struct S{ int a,b,c,d,e,f,g,h,i,j,k; }; // or int a[11]
std::atomic<S> as;
void atomic_struct_store_zero() {
S s = { 0 }; // initializes all members to zero
as.store(s);
}

compiles to__atomic_store 的函数调用,传递 src 和 dest 指针以及大小。大概它在某处使用了锁,但锁不是 as 的一部分。 . (sizeof(as) == sizeof(S) == 44)。

关于c++ - 原子商店。结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38515404/

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