【发布时间】:2020-12-13 12:19:28
【问题描述】:
假设我们有两个线程,在内存中使用两个变量 A 和 B:
Thread 1 Thread 2
======== ========
1) A = 1 3) B = 1
2) Print(B) 4) Print(A)
我知道在Sequential consistent (strong) model 你会得到
1 -> 2 -> 3-> 4 按顺序执行。 x86 是TSO,它接近于一个强模型(但不如一个强)。
我不明白周模型是什么?弱模型只是选择随机指令并执行吗?即像4 -> 2 -> 3 -> 1 这样的事情是可能的吗?
关于这个话题我还有 2 个问题:
-
Out-of-order execution由 CPU 完成以利用否则会被浪费的指令周期和memory reordering due to memory model之间有什么区别?还是memory reordering只处理Load/Store指令? -
memory model只有在处理多个线程时才需要考虑吗?为什么在单线程程序中不是问题?
【问题讨论】:
-
Re, "...reordering due to memory model..." 我从来没有听说过任何需要指令的内存模型重新排序。但是许多内存模型允许它。这就是内存模型的全部意义所在:足够宽容,以便可以在不同的硬件平台上有效地实现,并进行足够详细的描述/指定,以便程序员可以预测和处理后果。
-
Re,“我知道在顺序一致(强)模型中,您将按顺序执行 1 -> 2 -> 3-> 4。”这听起来好像您在说强顺序一致性要求线程 1 在线程 2 可以启动之前运行完成。这听起来根本不对。我在这里有点超出我的专业领域,但是在没有任何同步的情况下,我看不出保证不同线程执行的操作之间的任何时间关系有什么意义。线程的全部意义在于,它们可以被允许在大多数时间彼此独立运行。
标签: multithreading memory-barriers memory-model