我想知道我是否可以在不锁定 mips cpu(尤其是亚马逊或多瑙河)的情况下读取或写入共享 int 值。我的意思是如果这样的读取或写入是原子的(其他线程不能中断它们)。需要明确的是 - 我不想阻止线程之间的竞争,但我关心 int 值本身是否没有损坏。
假设编译器在 cpu 字的边界对齐所有 int,应该是可能的。我使用 gcc (g++)。测试还表明它似乎工作正常。但也许有人肯定知道?
我想知道我是否可以在不锁定 mips cpu(尤其是亚马逊或多瑙河)的情况下读取或写入共享 int 值。我的意思是如果这样的读取或写入是原子的(其他线程不能中断它们)。需要明确的是 - 我不想阻止线程之间的竞争,但我关心 int 值本身是否没有损坏。
假设编译器在 cpu 字的边界对齐所有 int,应该是可能的。我使用 gcc (g++)。测试还表明它似乎工作正常。但也许有人肯定知道?
使用 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
取决于操作。在 MIPS 中看了足够多的反汇编程序后,我知道只有一些操作是原子的。
新值的分配可能是 1 个操作或更多,您必须查看程序集。
例如:
x = 0; // move $a0, $0
x = 0x50000; // lui $a0, 0x0005
x = 0x50234; // lui $a0, 0x0005
// ori $a0, 0x0234
请参阅此处以查看多瑙河和亚马逊是 MIPS32,我的示例涵盖了这些,因此并非所有 32 位整数立即数都可以原子地编写。
请参阅上面发布的R10000是 MIPS64。由于 32 位值将是寄存器大小的一半,因此它可能是原子加载/写入。
哪些操作?这似乎int a; a=42;
是原子的。不能保证它a= a+42;
是原子的,或者像 with 一样的任何变体++
。此外,您必须关心优化器可能会做什么,例如在方便时将中间值保存在寄存器中。
这个问题会引起误导性的答案。
您只能权威地回答有关汇编/机器语言的“它是原子的”问题。
任何给定的 C/C++ 代码片段都不能保证,可能会根据您使用的编译器(和版本)而有所不同,等等。(除非您调用某些特定于平台的内在函数或保证编译为已知原子机器指令的东西。 )