线程会使用传入的旧值吗?
Will a thread use an old value passed in?
刚想到这个问题,找不到答案
如果我将一个静态非原始变量,比如 X,传递给一个稍后启动的线程(因此人们会假设该线程持有对 X 的引用),是否有可能在线程启动时,而不是从内存中读取 X,当 X 传递给线程时,它可能会使用 X 的旧值
或类似的场景:
thread A runs and writes X = a to RAM, then gets blocked by IO
thread B reads X = a from RAM, queues a unit of work to A, which would use X
thread A resumes and writes X = b to RAM, then it finishes what it had left
...
thread A resumes and runs that unit of work queued to it, which would use X
Is it possible that X would have the value a?
如果是,在主流平台上C、C++、Java、C#等主流语言有没有可能发生? (用于 java 的所有 jvm 版本以及用于 C# 的 .Net 和 Mono 的所有版本)?
我不希望发生这种情况,但很好奇它是否会在任何流行的平台上发生,可能会导致疯狂的编译器优化、缓存(总是有可能)、极其便宜的硬件等
这与对象无关(具体完全构建),而是对象的状态。因此,假设您在 X 中有构成 State 的计数器,并且是的,如果线程 a 写入计数器,那么线程 B 可能看不到更改。
我觉得你有点糊涂了。程序不会将数据从内存中读入……其他东西(说真的,你认为它会去哪里?)。它总是从内存中读取。
一直,每一次。所以不,您的情况根本不可能。它将始终具有更新的值。
快速免责声明,variables/data 总是可以被 CPU 缓存以避免 RAM 命中,所以如果 硬件 没有同步,这可能发生了,但这不是 language/runtime 的问题。 "Memory" 的软件概念包括 RAM、缓存和虚拟内存。
刚想到这个问题,找不到答案
如果我将一个静态非原始变量,比如 X,传递给一个稍后启动的线程(因此人们会假设该线程持有对 X 的引用),是否有可能在线程启动时,而不是从内存中读取 X,当 X 传递给线程时,它可能会使用 X 的旧值
或类似的场景:
thread A runs and writes X = a to RAM, then gets blocked by IO
thread B reads X = a from RAM, queues a unit of work to A, which would use X
thread A resumes and writes X = b to RAM, then it finishes what it had left
...
thread A resumes and runs that unit of work queued to it, which would use X
Is it possible that X would have the value a?
如果是,在主流平台上C、C++、Java、C#等主流语言有没有可能发生? (用于 java 的所有 jvm 版本以及用于 C# 的 .Net 和 Mono 的所有版本)?
我不希望发生这种情况,但很好奇它是否会在任何流行的平台上发生,可能会导致疯狂的编译器优化、缓存(总是有可能)、极其便宜的硬件等
这与对象无关(具体完全构建),而是对象的状态。因此,假设您在 X 中有构成 State 的计数器,并且是的,如果线程 a 写入计数器,那么线程 B 可能看不到更改。
我觉得你有点糊涂了。程序不会将数据从内存中读入……其他东西(说真的,你认为它会去哪里?)。它总是从内存中读取。
一直,每一次。所以不,您的情况根本不可能。它将始终具有更新的值。
快速免责声明,variables/data 总是可以被 CPU 缓存以避免 RAM 命中,所以如果 硬件 没有同步,这可能发生了,但这不是 language/runtime 的问题。 "Memory" 的软件概念包括 RAM、缓存和虚拟内存。