|
|
1
5
取决于CPU和内存的总线宽度。在PC环境中,除了真正古老的CPU之外,最多32位访问是原子访问;64位访问可能是也可能不是原子访问。在嵌入式空间中,很多(大多数?)CPU是32位宽的,没有任何更宽的配置,因此
|
|
2
3
我认为唯一正确的答案是“视情况而定”。你可能会问什么? 对于CPU的初学者来说。但也有一些CPU是用于写入字宽值的原子CPU,但仅在对齐时。在C语言水平上,这并不是你能保证的。 许多编译器提供“内部函数”来发出正确的原子操作。这些扩展的作用类似于函数,但是为目标体系结构发出正确的代码以获得所需的原子操作。例如: http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html |
|
|
3
1
你的问题是“一点一点”的。我不认为任何架构一次只做一点操作,除了一些专门的串行协议总线。标准内存读/写是用8、16、32或64位的粒度完成的。因此,您示例中的操作可能是原子操作。 然而,答案严重依赖于平台。
使用您发布的代码示例很可能会看到一个损坏的或意外的值。 您的平台可能提供了一些执行原子操作的方法。如果是Windows平台,则通过 Interlocked functions . 对于Linux/Unix,请查看 atomic_t type . |
|
|
4
0
除此之外,到目前为止,另一个潜在的问题是缓存。CPU倾向于使用本地(死后)内存缓存,这些缓存可能会或可能不会立即刷新回主内存。如果框中有多个CPU,则在修改CPU之后的一段时间内,另一个CPU可能不会看到这些更改-除非有某个同步命令通知所有CPU它们应该在死缓存上进行同步。正如您可以想象的那样,这种同步可以大大降低处理速度。 |
|
|
5
0
别忘了,在优化时编译器假设是单线程的,这整个过程可能就这样结束了。 |
|
|
6
0
posix定义特殊类型
|
|
|
7
0
考虑到现代微处理器(忽略微控制器),32位分配是原子的,而不是逐位的。 然而,现在完全脱离了你的问题主题…当然,由于本例中缺少同步,由于指令重新排序和多个核心(每个核心在其缓存中都有自己的g_ival副本),打印线程仍然可以打印一些不需要的内容。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |