是 C++ mips 架构上的 int 操作是原子的

发布于 2024-07-16 18:00:05 字数 242 浏览 13 评论 0 原文

我想知道我是否可以在不锁定 mips cpu 的情况下读取或写入共享 int 值(尤其是 Amazon 或 Danube)。 我的意思是这样的读取或写入是否是原子的(其他线程不能中断它们)。 需要明确的是 - 我不想阻止线程之间的竞争,但我关心 int 值本身是否没有损坏。

假设编译器将所有 int 对齐到 cpu 字的边界,这应该是可能的。 我使用 gcc (g++)。 测试还表明它似乎工作正常。 但也许有人肯定知道这一点?

I wonder if I could read or write shared int value without locking on mips cpu (especially Amazon or Danube). What I mean is if such a read or write are atomic (other thread can't interrupt them). To be clear - I don't want to prevent the race between threads, but I care if int value itself is not corrupted.

Assuming that the compiler aligns all ints at the boundaries of cpu word, it should be possible. I use gcc (g++). Tests also shows that it seems work correctly. But maybe someone knows it for sure?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦与时光遇 2024-07-23 18:00:05

使用 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

Use gcc's builtin atomic operations and you'll get warnings if they're not supported:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html

It looks like combinations of addition/subtraction and testing (at least) are possible on the hardware:
http://rswiki.csie.org/lxr/http/source/include/asm-mips/atomic.h

七堇年 2024-07-23 18:00:05

哪些操作? int a; 似乎是合理的。 a=42; 是原子的。 无法保证 a= a+42; 是原子的,或者是 ++ 等任何变体。 此外,您还必须关心优化器可能会做什么,例如在方便时在寄存器中保存中间值。

Which operations? It's plausible that int a; a=42; is atomic. There's no guarantee that a= a+42; is atomic, or in any variants like with ++. Also, you have to be concerned about what the optimizer might do, say by holding an intermediate value in a register when convenient.

神回复 2024-07-23 18:00:05

取决于操作。 在看过足够多的 MIPS 反汇编程序后,我知道只有某些操作是原子的。

新值的分配可能是 1 个操作或更多操作,您必须查看程序集。

例如:

x = 0; // move $a0, $0


x = 0x50000; // lui $a0, 0x0005


x = 0x50234; // lui $a0, 0x0005
             // ori $a0, 0x0234

MIPS assembley 参考此处

请参阅这里可以看到danube和amazon都是MIPS32,我的示例涵盖了这一点,因此并非所有32位整数立即数都可以原子写入。

请参阅上面帖子中的 R10000 是 MIPS64。 由于 32 位值是寄存器大小的一半,因此它可能是原子加载/写入。

Depends on the operation. Having stared at enough disassembled programs in MIPS, I know that only some operations are atomic.

assignment of a new value could be 1 op or more, you'd have to look at the assembly.

eg:

x = 0; // move $a0, $0


x = 0x50000; // lui $a0, 0x0005


x = 0x50234; // lui $a0, 0x0005
             // ori $a0, 0x0234

MIPS assembley reference or here

see here to see danube and amazon are MIPS32, which my example covers, and therefore not all 32bit integer immediate can be written atomically.

see R10000 in above posting is MIPS64. Since a 32bit value would be half the register size, it could be an atomic load/write.

忆离笙 2024-07-23 18:00:05

这个问题会带来误导性的答案。

您只能权威地回答有关汇编/机器语言的“是否是原子的”问题。

任何给定的 C/C++ 代码片段都不做任何保证,可能会根据您使用的编译器(和版本)等而有所不同(除非您调用一些特定于平台的内在函数或保证编译为已知原子机器指令的东西。 )

The question invites misleading answers.

You can only authoritatively answer "is it atomic" questions about assembly/machine language.

Any given C/C++ code fragment makes no guarantees, can vary depending on exactly which compiler (and version) you use, etc. (Unless you call some platform-specific intrinsic or whatnot that is guaranteed to compile to a known atomic machine instruction.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文