并发写入相同的内存地址

时间:2009-11-21 20:38:07

标签: memory parallel-processing

如果两个线程同时尝试写入同一个地址,那么并发写入后的值是否保证是线程尝试写入的值之一?或者是否可以获得这些位的组合?

另外,当位处于不稳定状态时,另一个线程是否可以读取存储器地址?

我想问的问题是,如果对单个内存地址的读取或写入在硬件级别是原子的。

5 个答案:

答案 0 :(得分:5)

我认为这完全取决于您的特定编程语言或系统的“内存模型”。

答案 1 :(得分:2)

这些问题是系统或/和编程语言内存模型的基础。因此,选择您自己的操作系统和编程语言,阅读规范,你会看到。

答案 2 :(得分:1)

在某些情况下,当两个线程写入不同的内存地址时,结果可能同样不可预测 - 特别是考虑C位域结构,以及写入相邻地址时的编译器优化。

如果你喜欢阅读,Boehm的论文“Threads cannot be implemented as a library”涵盖了这个和其他并发的怪癖。

答案 3 :(得分:0)

在多处理器计算机上,可能没有读取的单个“值”。两个线程和第三个线程可能会看到不一致的值。您需要一个内存屏障来确保每个线程在此地址看到相同的值。

除此之外,写入通常是原子的,因此它将是已读取(或首先存在)的值中的一个或另一个。你不是在谈论Alpha处理器,是吗?

答案 4 :(得分:0)

有一点可以肯定,对于大小等于CPU的数据类型,寄存器永远不会有位于不稳定状态的位,它将是两个值中的任何一个