gpt4 book ai didi

multithreading - 一个进程之间的线程可见性

转载 作者:行者123 更新时间:2023-12-04 06:37:16 24 4
gpt4 key购买 nike

我最近正在阅读 Crack Code Interview 一书,但在第 257 页有一段让我很困惑:

A thread is a particular execution path of a process; when one thread modifies a process resource, the change is immediately visible to sibling threads.



IIRC,如果一个线程对一个变量进行了更改,该更改将首先保存在 CPU 缓存(比如 L1 缓存)中,并且不会保证同步到其他线程,除非该变量声明为 volatile。

我对吗?

最佳答案

不,你错了。但这是一个非常普遍的误解。

每个现代多核 CPU 都有硬件 cache coherence . L1 和类似的缓存是不可见的。像 L1 缓存这样的 CPU 缓存与内存可见性无关。

当线程修改进程资源时,更改立即可见。问题是导致进程资源没有按照代码指定的顺序进行修改的优化。

如果您的代码有 k = j; i = 4; if (j == 2) foo();优化器可能会看到您的第一个赋值读取 j 的值.因此,当您将其与 2 进行比较时,可能不会再费心阅读它。因为它“知道”它不可能改变。但是,另一个线程可能已经改变了它。因此,当需要线程之间的同步时,需要禁用某些类型的优化。这就是 volatile 之类的东西做。

如果编译器和 CPU 不进行优化并按照编写的方式精确执行程序,volatile永远不需要。内存可见性是关于代码优化(一些由编译器完成,一些由 CPU 完成),而不是缓存。

关于multithreading - 一个进程之间的线程可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16259793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com