什么是线程上下文?

Wil*_*son 21 c# java multithreading synchronization

线程的上下文是否指向线程的个人内存?如果是这样,多个线程之间如何共享内存?

我不是在寻找代码示例 - 我在高层次上理解同步,我只是对这个术语感到困惑,并且希望对场景背后的实际情况有所了解.

我认为/认为每个线程都有某种私有内存的原因是因为Java和.NET中的volatile关键字,以及如果不使用相同的原语,不同的线程如何可以具有不同的值.那总是暗示着我的私人记忆.

由于我没有意识到这个术语更为通用,我想我是在问Java和C#中的上下文切换是如何工作的.

Eri*_*ert 37

我认为/认为每个线程都有某种私有内存的原因是因为Java和.NET中的volatile关键字,以及如果不使用相同的原语,不同的线程如何可以具有不同的值.那总是暗示着我的私人记忆.

好的,现在我们得到了你的困惑的来源.这是关于现代编程最令人困惑的部分之一.你必须围绕这个矛盾:

  • 进程中的所有线程共享相同的虚拟内存地址空间,但是
  • 任何两个线程可以随时对该空间的内容不同意

怎么可能?因为

  • 处理器出于性能原因制作内存页的本地副本,并且只是不经常比较注释以确保所有副本都说同样的东西.如果两个线程在两个不同的处理器上,则它们可以具有完全不一致的"相同"存储器视图.

  • 单线程场景中的内存通常被认为是"静止的",除非某些东西导致它发生变化. 这种直觉在多线程进程中很难为你服务.如果有多个线程访问内存,那么最好将所有内存视为持续处于不稳定状态,除非某些内存强制它保持静止.一旦你开始认为所有内存都在变化,就会发现两个线程的视图不一致.风暴期间没有两部海洋电影是相似的,即使是同一场风暴.

  • 编译器可以自由地对在单线程系统上不可见的代码进行任何优化.在多线程系统上,这些优化可能突然变得可见,这可能导致数据视图不一致.

如果其中任何一个不清楚,那么首先阅读我的文章,解释C#中"volatile"的含义:

http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx

然后在Vance的文章中阅读"需要内存模型"部分:

http://msdn.microsoft.com/en-us/magazine/cc163715.aspx

至于关于线程是否有自己的内存块的具体问题,答案是肯定的,有两种方式.首先,由于线程是一个控制点,并且由于堆栈是控制流的具体化,因此每个线程都有自己的百万字节堆栈.这就是线程如此昂贵的原因.在.NET中,每次创建线程时,这些百万字节实际上都会提交给页面文件,因此请注意创建不必要的线程.

其次,线程具有恰当命名的"线程本地存储",它是与线程可用于存储有趣信息的每个线程相关联的一小部分内存.在C#中,您使用该ThreadStatic属性将字段标记为线程的本地.

  • 接下来的想法是,如果UI上下文中的线程请求了位图渲染的结果,并且渲染尚未完成,那么渲染任务的计划完成将在UI上下文中的线程上执行*而不是*在渲染上下文*中的一个线程上.相比之下,如果任务的完成恰好是"我需要更多渲染",那么你选择的十个渲染线程中的哪一个并不重要; 任何空闲线程都可以.当我*说"线程上下文"时,这就是我的意思. (2认同)

Sim*_*ead 9

"线程上下文"的实际组成是特定于实现的,但通常我总是理解线程的上下文来引用线程的当前状态以及它在特定时间如何查看内存.这就是"上下文切换"......保存和恢复线程的状态(它的上下文).

内存在上下文之间共享......它们是同一进程的一部分.

我并不认为自己是这个主题的专家......但这是我一直理解的具体术语.