【发布时间】:2021-01-11 22:58:50
【问题描述】:
假设我有一些使用共享内存的多线程程序,其中多个线程随机覆盖某个 multi-byte 变量的值(例如 int 或 double ),有时会相互碰撞(也称为竞态条件),并且也会随机从同一变量中读取值。
假设所有线程总是将相同的值写入内存地址(例如,每个线程都执行x = 1000) - 如果一个线程在另一个线程正在读取的确切时刻读取变量/正在覆盖它,变量是否保证具有正确的值?或者内存会以某种方式被随机的东西覆盖吗?
也就是说,如果所有线程总是写x = 1000,那么一个线程可以读x并得到1000以外的东西吗?
【问题讨论】:
-
@Matthieu 没用。
-
例如考虑一个存储器,它需要在写入之前先擦除一个存储单元(如某些闪存)。那么您的竞速读取可能会在擦除周期之后但在写入值之前获得。
-
@Matthieu volatile 不会使任何东西成为线程安全的。
-
同时读写 --> 可能是总线故障。 “曾经有一个名为 Lime 的程序;它的所有写操作同时进行;直到有一天它读到;它说的值相同;......并以一滩污垢告终。” ??????
-
没有。
volatile确保 代码 实际上正在执行内存访问,并且没有做出允许对其进行优化的假设。内存访问可以在硬件级别缓存,volatile不会阻止它。这纯粹是一个编译器级别的构造,它不会生成任何特殊的缓存绕过内存访问指令
标签: c multithreading shared-memory