【问题标题】:hardware state when read and writes on the same variable from separate threads从不同线程读取和写入同一变量时的硬件状态
【发布时间】:2013-03-20 00:25:21
【问题描述】:

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

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

问题:假设我从一个线程写入一个变量,并从另一个线程读取相同的变量。会发生什么?

  1. 只是破坏变量的值,这样所有后续线程都会读取 由于此读/写交错导致的错误值?

  1. 在某些情况下,也可能导致应用出现故障,因为在某些情况下这可能是某种硬件违规。

本质上,我想更多地了解同时物理读取和写入变量的过程以及 PC 的行为。

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

  • 同一物理内核上的 2 个线程

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

【问题讨论】:

  • 什么平台?什么大小变量?您是指在不同的物理内核上运行的线程,还是在同一个内核上运行的线程?
  • 我正在使用 LINUX 和 C++,具体而言,我对 2 个案例感兴趣。 A.线程在同一个核心。 B. 不同核心中的线程。数据是 C++ 布尔值、整数和双精度值。
  • 嗯,在同一个物理内核上运行的两个线程不能同时访问内存,因为它们不会同时运行;)

标签: multithreading hardware race-condition


【解决方案1】:

这完全取决于什么样的硬件和变量的大小。对整数的访问通常是原子的,但对双精度数的访问通常不是。即使对于简单的小值,不同的硬件也可能具有非常不同的行为。您需要获取硬件手册的副本。这是一篇讨论该领域的帖子:Does one assembler instruction always execute atomically?

除非硬件设计不当,否则读取不会改变写入的行为,但如果读取看到写入的一部分而不是其余部分,则写入可能会导致读取的值不正确。

【讨论】:

  • 即使对于多字操作,可能发生的最坏情况是读取损坏的值,对吧?我认为只有通过寄存器间接寻址这个不正确的值可能会导致内存冲突。
  • @谢谢彼得。我明白了,我需要确认您回复的最后一部分:假设一旦由于并发写入而读取的值不正确,就会发生这种情况。对该变量的 NEXT 读取(没有并发写入)会发生什么?第一次读取被并发写入破坏,但第二次读取会返回正确的变量吗?我想据我所知,写入行为不会被写入改变(如果有 2 个并发写入,情况就不会如此)。
  • @AbruzzoForteeGentile 后续读取会很好,写入不会受到影响,因此存储的数据我会是正确的。对于并发写入,所有赌注都没有了。
  • @彼得。您好,非常感谢您的回复。都非常清楚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2012-01-14
  • 2011-11-22
  • 2020-10-21
  • 2013-09-09
  • 2018-11-14
相关资源
最近更新 更多