gpt4 book ai didi

ios - ios/arm 平台上哪些整数运算是原子的?

转载 作者:行者123 更新时间:2023-12-01 15:35:25 26 4
gpt4 key购买 nike

如果我有一个整数 x,以下哪些语句在 iPhone 的 ARM 架构上是原子的?

int x;
int y;
x = 92; // . . . . . . A
x++; // . . . . . . B
y = ++x; // . . . . . . C
printf("x = %d\n", x); // D

我知道,在 i386 平台上,语句 A、B 和 D 是原子的,而 C 不是。我很确定 C 在 iOS 中不是原子的。我怀疑基本的加载和存储操作(D 和 A)在 iOS 中也是原子的,但我不确定。有人知道更多吗?

16 位和 8 位值如何?或者在 iPhone 5S 上使用 64 位值,在 iPhone 5 及更低版本上使用 64 位值?

(如果答案是我怀疑的......是否有任何平台的基本加载和存储操作不是原子的?)

最佳答案

您没有在 x 的声明中提供足够的上下文和 y .如果函数内有局部变量,那么它们将被分配给寄存器,其他线程不能接触它们。所以我假设你的意思是它们是全局的(或者至少是静态的)。

是一种加载存储架构。它没有内存到内存指令。所以真的只有线路 A/D 是原子的。您已无条件写入该值。与另一个线程相比,它不是有序的。如果一个线程写 92另一个写道 29 ,如果没有某种互斥锁,就无法知道写了什么。

cpu有swp ;但大多数iOS产品都会使用ldrexstrex .您必须使用这些指令进行任何类型的原子更新。

可以一次写入 8/16/32/64 位,大多数系统设计都会同步缓存,以便一个 CPU 的写入被另一个 CPU 看到。环形缓冲区结构可以与生产者/消费者一起使用,其中只有一个 CPU 写入环头,另一个写入环尾;即,这将是您可以在没有 swp 的情况下使用的原子结构或 ldrexstrex .

如果您手动分配 64 位值,则可能会将事情搞砸。你将不得不努力做到这一点。例如,如果在 64 位值的高/低 32 位之间发生页面错误。显然,根据 CPU 类型,未对齐的值也可能存在问题。如果你正常声明东西,它们应该被编译器很好地对齐。这对于未对齐的 32 位和 16 位值也是可能的。 iOS 可能会使这些访问在用户空间看起来是原子的。一般来说,如果你依赖原子行为,你不应该做任何奇怪的转换,并正常声明变量。

编辑:

(If the answer is as I suspect... Is there any platform where basic load and store operations are not atomic?)



是的,有很多平台的较大值加载/存储不是原子的;特别是对于所有数据类型。实际上,大多数 CPU 至少是 8 位的(尽管甚至存在 4 位 CPU),因此 char加载和存储通常是原子的。对于较小的 CPU,较大值的加载/存储可能需要几个周期。在这些情况下,编译器将花费多个周期来更新值。这就是 sig_atomic_t 背后的想法;它是一个可变大小,可以自动更新。 sig_atomic_t应该适用于所有 Posix systems ,但在普通 中没有一般保证C99 . C11添加 _Atomic类型限定符。

关于ios - ios/arm 平台上哪些整数运算是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20616892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com