【发布时间】:2020-08-08 15:37:50
【问题描述】:
Stroustrup 在C++ 4th Ed Page 1193 中给出了以下示例。我的问题是使用两个线程的并发程序,一个用于f(),另一个用于g(),Stroustrup 的声明是:
如果链接器在内存中的同一个字中分配 c 和 b 并且(像大多数现代硬件一样)",
变量c 和b 会发生什么情况?
在某些硬件上,我的理解是一个单词是 2 个字节,并且两个变量都包含在其中,一个线程可能会覆盖另一个线程的 char。
Stroustrup 进一步指出:
如果没有定义明确且合理的内存模型,线程 1 可能 读取包含 b 和 c 的单词,更改 c,然后将单词写回 进入记忆。同时,线程 2 可以对 b 做同样的事情。 然后,无论哪个线程设法先读到这个词,无论哪个 管理最后将其结果写回内存的线程将 确定结果。我们可能会得到 10、01 或 11(但不是 00)。这 记忆模型将我们从这种混乱中解救出来;我们得到 11. 00 的原因 不可能发生的是 b 和 c 的初始化已经完成(通过 编译器或链接器)在任一线程启动之前。
我的困惑是,为了解决这个问题,C++ 链接器是否将 c 放在一个 2 字节内存地址中,而将 b 放在另一个?
// thread 1
char c = 0;
void f()
{
c = 1;
int x = c;
}
char b = 0;
void g()
{
b = 1;
int y = b;
}
【问题讨论】:
-
"因为一个单词是 2 个字节" 需要引用。
-
移除 x86 并使用 2 个字节作为示例大小
-
@NicolBolas——微软在他们的标准中这么说。一定是这样的。
-
@Scheff -- 我在开玩笑。
-
@Andy 术语 word 是在 Microsoft 在其操作系统/API 中赋予它特定含义之前使用的。因此,字长通常取决于硬件 - 也用作“机器字长” - 一次处理的数量。 Word (Wikipedia)
标签: c++