在ARMv8 CPU上给出类似的东西(虽然这可能也适用于许多其他人):
class abcxzy
{
// Pragma align to cacheline to ensure they exist on same line.
unit32_t atomic_data;
uint32_t data;
void foo()
{
volatile asm (
" ldr w0, [address of data]\n"
"# Do stuff with data in w0..."
" str w0, [address of data]\n"
"1: ldaxr w0, [address of atomic_data]\n"
" add w1, w0, #0x1\n"
" stxr w2,w1, [address of atomic_data]\n"
" cbnz w2, 1b\n"
);
}
}
在Asm内联上设置适当的咒语,以便C和Asm可以在彩虹小马和阳光的世界中快乐地共存。
在多CPU情况下,同时运行此代码的所有代码,data
的存储会导致atomic_data
的原子加载/存储失败吗?从我所读过的内容来看,ARM原子的工作原理是基于缓存行,但不清楚非原子存储是否会影响原子。我希望它没有(并假设它确实......),但我希望看看是否有其他人可以证实这一点。
答案 0 :(得分:2)
好的,终于找到了我需要的东西,虽然我不喜欢它:
根据ARM文档,实现定义是否与专用存储相同的高速缓存行的非独占存储导致专用存储失败。谢谢ARM。欣赏那些精彩的非定论信息。
编辑:
失败,我的意思是stxr
命令没有写入内存并在状态寄存器中返回“1”。 “您的原子数据已更新,需要新的RMW”状态。
回答其他陈述:
是的,原子临界区应该尽可能小。 docs事件给出的数字有多小,而且确实非常合理。我希望我的部分不会超过1k或更多......
是的,在任何情况下你都需要担心这种争用的性能或更糟糕的意味着你的代码“做错了”。 ARM文档通过以下方式说明:)
关于将非原子载荷和存储放在原子中 - 我上面的伪测试只是演示了对同一缓存行的随机访问作为一个例子。在实际代码中,你显然应该避免这种情况。我只是试图了解一下,如果高速硬件定时器存储器与锁相同的高速缓存行,可能会有多么糟糕。再说一次,不要这样做......