紧凑结构体内的变量可以原子地读取吗?

3
我正在为Cortex M0 (ARM) CPU编写代码,并且32位读/写是原子性的。那么我想知道当我读/写8位/16位变量时,它们是否也保证是原子性的?我的直觉告诉我是,因为它们内部对齐为32位节,所以CPU不需要两个单独的指令来读取/写入它们。
但是我也在紧凑型结构中存储了大量变量以节省内存,在这种情况下,变量可能未对齐到32位边界,因此16位值的每一半可能在不同的节中。
因此,在使用紧凑型结构时,我失去了原子操作,这是真的吗?

1
你从来没有保证原子操作。https://dev59.com/SnI-5IYBdhLWcg3wkJMA?rq=1 - Paul Hankin
一个实现不仅包括硬件,还包括操作系统、编译器和标准库。由于您标记了“gcc”,我会假设您正在使用某个操作系统。哪些文档告诉您有关原子性的信息?您的硬件是否与您的操作系统、gcc 和 libgcc 就“原子”定义达成一致?您的硬件如何处理在同一核心上运行的不同软件线程的读/写操作? - autistic
@匿名者 一般来说,你对C语言的假设是正确的。但是,针对特定的CPU和编译器,你可能会对操作的原子性有更好的了解。现在这将导致完全不可移植的代码。 - greydet
@modifiablelvalue 我没有使用操作系统,而是嵌入式系统。 - Maestro
@Joshua 那个回复只与我提出的三个问题中的一个略微相关。请仔细阅读我的最后一条评论,并尽可能引用有关您实施方案的所有方面(而不仅仅是硬件)的手册来回答所有问题,以便我可以帮助您... - autistic
3
使用紧凑结构体并不能有效地“节省内存”。你只需要正确地对成员进行排序,以避免填充即可实现相同的内存节省效果。 - R.. GitHub STOP HELPING ICE
1个回答

2

使用紧凑结构时,您将永远不会在重叠内存单元边界的字段上进行读/写原子操作。这意味着仅保证8位操作是原子的,否则它取决于字段的内存对齐方式。


考虑一个没有任何并发概念的独立实现。 - autistic
3
@modifiablelvalue 所以呢?缺少并发性并不意味着原子性。 - greydet
@modifiablelvalue,即使您没有线程,也可以拥有信号和信号处理程序。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接