从不同的线程读写同一变量时的硬件状态



我的问题范围严格限于内存中地址的同时读写以及硬件中发生的事情。

我对了解竞态条件以及在程序继续执行后使用竞态发生的值可能携带的内容不感兴趣。如果pc的逻辑坏了,是的,它们可能也会导致崩溃,但这里我的问题是严格关于硬件和同时线程的WRITE+READ的影响。

问题:假设我从一个线程写入一个变量,并从另一个线程读取同一个变量。会发生什么?
  1. 只是破坏变量的值,以便所有后续线程将读取一个错误的值由于这个读/写的交错?

  1. 在某些情况下,也可能导致应用程序宕机因为这可能在某些情况下违反了硬件。

从本质上讲,我想知道更多关于物理读取和写入变量的过程,以及PC的行为。

我正在使用LINUX和c++,我对两个案例感兴趣

  • 两个线程在同一个物理内核

  • 2个线程在2个独立的内核

这完全取决于什么类型的硬件和什么大小的变量。对整型的访问通常是原子的,但对双精度的访问通常不是。即使对于简单的小值,不同的硬件也可能有非常不同的行为。你需要一份硬件手册。这里有一篇文章讨论了这个领域的一些问题:一个汇编指令总是自动执行吗?

read不会改变写操作的行为,除非硬件设计得很差,但是如果读操作看到了写操作的一部分而没有看到其余部分,那么写操作可能会导致正在读的值不正确。

最新更新