全局变量是否由三个线程(2 个写入器,1 个读取器)访问,没有任何可能未定义的同步?

问题描述 投票:0回答:1

在windows/linux多线程C程序中,如果一个

unsigned int
全局变量在没有任何同步的情况下被三个线程访问,其中

  • 线程 1 写入值 0
  • 线程 2 写入值 0xFFFFFFFF
  • 线程3读取值

问题

线程 3 是否可以从全局变量中检索部分值,例如 0x0000FFFF?

我一直假设如果

unsigned int
正确对齐,则写入操作是原子的,因此在这种情况下,线程 3 将始终为 0 或 0xFFFFFFFF。

c multithreading atomic stdatomic
1个回答
0
投票

您忘记了一种很可能的情况:线程 3 根本不读取该值,而是使用之前读取的值。

同步不仅可以防止部分读/写,还可以防止部分读/写。它还通知 CPU 和编译器该值可能会被另一个线程更改。他们可以并且确实假设如果没有同步就不会发生这种情况,因此可以使用缓存的值,或者可以优化读取等等。

(我在这里宽松地使用术语“同步”。)

考虑到这种可能性,最终是否能得到 0000FFFF 是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.