与原子变量的非原子负载会导致原子变量失败
Will a non-atomic load to the same cache line as an atomic variable cause the atomic variable to fail?
在ARMV8 CPU上给出了类似的东西(尽管这也可能适用于许多其他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, #0x1n"
" stxr w2,w1, [address of atomic_data]n"
" cbnz w2, 1bn"
);
}
}
使用适当的clobbers以及ASM内联的设置,以便C和ASM可以在彩虹小马和阳光的世界中愉快地共存。
在多个CPU的情况下,所有这些都同时运行此代码,将存储到data
会导致原子负载/存储到atomic_data
失败吗?从我阅读的内容来看,ARM原子的物质在缓存线的基础上起作用,但是尚不清楚非原子商店是否会影响原子。我希望它不会(并假设它确实...),但是我希望看看其他人是否可以确认。
好,终于找到了我需要的东西,尽管我不喜欢它:
根据ARM文档,实施定义了与独家商店相同的缓存线上是否会导致独家商店失败。谢谢ARM。感谢这个精彩的非确定信息。
编辑:
失败,我的意思是stxr
命令未写入存储器并在状态寄存器中返回" 1"。"您的原子数据已更新并需要新的RMW"状态。
回答其他语句:
-
是的,原子关键区域应尽可能小。文档事件给出了有关小的数字,而且它们确实非常合理。我希望我的部分永远不会跨越1K或更多...
-
,是的,您需要担心这种争夺性能或更糟糕的任何情况都意味着您的代码"做错了"。手臂文档以关于方式说明:)
-
将非原子载荷和存储放在原子中 - 上面的我的伪测试只是演示了对同一缓存线的随机访问示例。在实际代码中,您显然应该避免这种情况。我只是想让一种感觉,如果高速硬件计时器商店可能与锁相同的高速公路线路。再次,不要这样做...
相关文章:
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- docker 构建失败:无法设置环境变量
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 是变量初始化失败吗?
- 当变量和参数名称匹配时,移动语义构造失败
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 类模板在其构造函数中的模板变量推导失败
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 运行时检查失败 - 变量周围的堆栈已损坏
- 为什么通过通用引用运算符 (&&) 将变量的引用传递给 Varadic 模板函数失败?
- 在构造函数中设置变量失败?
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'k'已损坏
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 与原子变量的非原子负载会导致原子变量失败
- 为什么在我的代码中将值从构造函数 var 传递到类变量失败?C++
- 模板函数中的静态变量失败
- 无符号char类型变量I/O失败