什么是线程上下文?
线程的上下文是否是指线程的个人记忆?如果是这样,如何在多个线程之间共享内存?
我不是在寻找代码示例 - 我在高层次上理解同步,我只是对这个术语感到困惑,并希望深入了解幕后实际发生的事情。
我认为/认为每个线程都有某种私有内存的原因是因为Java和.NET中的volquential关键字,以及如果不使用它,不同的线程可以对同一基元具有不同的值。这对我来说总是意味着私人记忆。
由于我没有意识到这个术语更通用,我想我是在问上下文切换在Java和C#中是如何工作的。
线程的上下文是否是指线程的个人记忆?如果是这样,如何在多个线程之间共享内存?
我不是在寻找代码示例 - 我在高层次上理解同步,我只是对这个术语感到困惑,并希望深入了解幕后实际发生的事情。
我认为/认为每个线程都有某种私有内存的原因是因为Java和.NET中的volquential关键字,以及如果不使用它,不同的线程可以对同一基元具有不同的值。这对我来说总是意味着私人记忆。
由于我没有意识到这个术语更通用,我想我是在问上下文切换在Java和C#中是如何工作的。
我认为/认为每个线程都有某种私有内存的原因是因为Java和.NET中的volquential关键字,以及如果不使用它,不同的线程可以对同一基元具有不同的值。这对我来说总是意味着私人记忆。
好了,现在我们来看看你困惑的根源。这是现代编程中最令人困惑的部分之一。你必须把你的头缠绕在这个矛盾上:
这怎么可能?因为
处理器出于性能原因制作内存页的本地副本,并且很少比较注释以确保其所有副本都说相同的内容。如果两个线程位于两个不同的处理器上,则它们可能具有完全不一致的“相同”内存视图。
单线程方案中的内存通常被认为是“静止的”,除非某些原因导致它发生变化。这种直觉在多线程进程中对你没有多大帮助。如果有多个线程访问内存,则最好将所有内存视为始终处于不断变化的状态,除非某些原因迫使它保持静止。一旦你开始认为所有的内存都是在变化的,很明显,两个线程可能有一个不一致的视图。没有两部关于暴风雨期间海洋的电影是一样的,即使它是同一场风暴。
编译器可以自由地对在单线程系统上不可见的代码进行任何优化。在多线程系统上,这些优化可能会突然变得可见,这可能导致数据视图不一致。
如果其中任何一个不清楚,那么首先阅读我的文章,解释“volatile”在C#中的含义:
然后在这里阅读Vance文章中的“记忆模型的需求”部分:
http://msdn.microsoft.com/en-us/magazine/cc163715.aspx
现在,至于线程是否具有自己的内存块的具体问题,答案是肯定的,在两个方面。首先,由于线程是控制点,并且堆栈是控制流的重新化,因此每个线程都有自己的百万字节堆栈。这就是线程如此昂贵的原因。在 .NET 中,每次创建线程时,这些百万字节实际上都会提交到页面文件,因此在创建不必要的线程时要小心。
其次,线程具有恰如其分的“线程本地存储”,这是与线程可用于存储有趣信息的每个线程关联的一小部分内存。在 C# 中,使用该特性将字段标记为线程的本地字段。ThreadStatic
“线程上下文”的实际构成是特定于实现的,但通常我总是将线程的上下文理解为引用线程的当前状态以及它在特定时间如何查看内存。这就是“上下文切换”的含义。保存和恢复线程的状态(它是上下文)。
内存在上下文之间共享。它们是同一过程的一部分。
我不认为自己是这个话题的专家。但这就是我一直理解这个特定术语的意思。