在windows/linux多线程C程序中,如果一个
unsigned int
全局变量在没有任何同步的情况下被三个线程访问,其中
问题
线程 3 是否可以从全局变量中检索部分值,例如 0x0000FFFF?
我一直假设如果
unsigned int
正确对齐,则写入操作是原子的,因此在这种情况下,线程 3 将始终为 0 或 0xFFFFFFFF。
您忘记了一种很可能的情况:线程 3 根本不读取该值,而是使用之前读取的值。
同步不仅可以防止部分读/写,还可以防止部分读/写。它还通知 CPU 和编译器该值可能会被另一个线程更改。他们可以并且确实假设如果没有同步就不会发生这种情况,因此可以使用缓存的值,或者可以优化读取等等。
(我在这里宽松地使用术语“同步”。)
考虑到这种可能性,最终是否能得到 0000FFFF 是没有意义的。