多个线程和布尔寄存器

时间:2015-03-18 22:09:09

标签: multithreading concurrency boolean

我的问题非常简单;两个不同的线程可以在同一时刻将布尔值设置为true或false吗?如果没有,为什么不呢?

如果没有当两个线程同时到达代码时会发生什么,他们将布尔值设置为某个值,硬件是否随意使一个等待分裂?

或者,如果可以,那么最终值如何确定?

无论是或否,对所有类型的变量都是如此吗?

2 个答案:

答案 0 :(得分:1)

完全相同的时刻?我怀疑你可以得到足够的挑剔,除非你指定惯性参照系等等,否则没有这样的东西......

如果你有一个核心,绝对不是。它必须通过时间切片运行多个线程。

如果处理器中有多个内核,只有一个数据和地址总线,那么仍然没有。两个进程无法同时写入内存。处理器必须以特定的方式与存储器通信,具体取决于存储器的类型等。 - 但基本上你必须设置一个地址,然后执行读或写周期来传输数据 - 你不能拥有这样做的两个过程。内存管理硬件将使其中一个等待。

如果你有两个带共享内存的处理器,那么......仍然没有,如果那个设计系统的人当时心智正常。

但从编程的角度来看,它们可以足够接近,以至于它们可能同时存在;使用一个关键部分,或互斥,或其他什么,并使其中一个线程稍微退后一点,而另一个读取,修改,写入。

但是如果你的变量大于机器的字大小(在这一天和年龄可能意味着> 64位)或数组变量或类似变量,那么是 - 你可以有两个线程处理不同的单词在变量中同时。

答案 1 :(得分:0)

它依赖于实现。它依赖于架构。它依赖于处理器负载,依赖于进程调度,几乎完全取决于月亮的相位(我不会在最后一个上投入资金)。

简短的回答是,其中一个主题将在长期内取得成功。在短期内,他们可能对布尔值的实际值有不一致的看法,并且这些观点在完全不确定(可能不一致)的时间段后会发生变化。

硬件不会使一个线程等待,因为硬件不会自动知道它们都在同时尝试写入同一个内存位置。从长远来看,它可能会注意到这一点,但在那一点上做任何聪明的事情都为时已晚。使用布尔值获取其路径的线程将是其处理器高速缓存恰好写回高速缓存行 second 的线程。毕竟,您的处理器内核并不是每个都有直接连接到您的RAM芯片。他们必须通过你的内存控制器,你只有其中一个。

至于是否所有变量都是如此......毫无疑问。如果变量符合内存的话,绝对适用于所有现代计算机体系结构。如果它适合一个缓存行,那么可能。但也有一种可能性,特别是对于较大的结构,变量的一半将来自一个螺纹,一半来自另一个螺纹。如果线程更新内存(比如说增加一个),而不是单独(比如设置它们的线程ID),那么两个线程成功实现它们要完成的目标的可能性会进一步减少。

这个错误机会雷区的答案,BTW,(按实用性与性能的顺序)(a)使用同步原语如互斥,(b)使用原子操作,以及(c)理解正在进行的线程内存模型。