我想知道我是否可以在不锁定mips cpu(尤其是Amazon或Danube)的情况下读取或写入共享int值。我的意思是如果这样的读或写是原子的(其他线程不能中断它们)。要清楚 - 我不想阻止线程之间的竞争,但我关心int值本身是否已损坏。
假设编译器在cpu字的边界处对齐所有的int,它应该是可能的。我用gcc(g ++)。测试还表明它似乎正常工作。但也许有人肯定知道吗?
答案 0 :(得分:6)
使用gcc的内置原子操作,如果不支持,你会收到警告: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
看起来硬件上可以进行加/减和测试(至少)的组合: http://rswiki.csie.org/lxr/http/source/include/asm-mips/atomic.h
答案 1 :(得分:5)
取决于操作。在MIPS中盯着足够的反汇编程序,我知道只有一些操作是原子的。
新值的分配可能是1 op或更多,您必须查看程序集。
例如:
x = 0; // move $a0, $0
x = 0x50000; // lui $a0, 0x0005
x = 0x50234; // lui $a0, 0x0005
// ori $a0, 0x0234
请参阅here以查看多瑙河和亚马逊是MIPS32,我的示例涵盖了MIPS32,因此并非所有32位整数立即可以原子方式编写。
在上面的帖子中看到R10000是MIPS64。由于32位值是寄存器大小的一半,因此可能是原子加载/写入。
答案 2 :(得分:4)
哪些操作? int a; a=42;
是原子的,这似乎是合理的。不能保证a= a+42;
是原子的,或者与++
一样的任何变体。此外,您必须关注优化器可能会做什么,比如在方便时将中间值保存在寄存器中。
答案 3 :(得分:3)
这个问题会引起误解。
你只能权威地回答关于汇编/机器语言的“是原子的”问题。
任何给定的C / C ++代码片段都不做任何保证,可能会根据您使用的确切的编译器(和版本)等而有所不同(除非您调用某些特定于平台的内在函数或者保证编译为已知原子的东西)机器指令。)