线程上下文和同步上下文

时间:2018-10-24 19:23:01

标签: c# .net multithreading asynchronous threadpool

我看到有关线程的文档中使用了术语Thread ContextSynchronization Context。他们指的是同一件事吗? 这是Microsoft对线程上下文的定义:

  

线程上下文包括线程需要的所有信息   无缝恢复执行,包括线程的CPU集   在线程主机的地址空间中注册和堆栈   过程。

据我了解,线程池中的线程共享相同的同步上下文。这是否意味着它们具有相同的线程上下文?

1 个答案:

答案 0 :(得分:3)

同步上下文和线程上下文是两个非常不同的东西。同步上下文是一种可以将工作单元排队到上下文(主要是不同的线程)的方法。 Here是引号。

  

SynchronizationContext的一个方面是它提供了一种方法   将工作单元排队到上下文中。请注意,此工作单元是   排队到上下文而不是特定线程。这个区别是   重要,因为SynchronizationContext的许多实现   不是基于单个特定线程。

同步上下文有用的一个典型示例是WinForms或WPF应用程序之类的GUI应用程序。在WinForms和WPF中,只有一个UI线程可以更新UI元素(文本框,复选框等)。如果尝试从另一个非UI线程更改文本框的内容,则不会发生更改,否则可能会引发异常(取决于UI框架)。因此,在此类应用程序中,工作人员非UI线程需要将对UI元素的所有更改安排到UI线程。这就是同步上下文所提供的。它允许您将工作单元(某种方法的执行)发布到不同的上下文-在这种情况下为UI线程。

另一方面,线程上下文是一种结构,其中包含操作系统执行线程代码所需的所有信息。如果OS需要将执行从一个线程更改为另一个线程,它将执行称为上下文切换的操作。在上下文切换中,操作系统将冻结当前在CPU上运行的线程,并将所有CPU寄存器的当前状态存储到冻结线程的线程上下文结构中。 Here是Windows操作系统上的实际线程上下文结构,而here是x64 Windows上的实际线程上下文结构。当所有CPU寄存器的内容移至冻结线程的线程上下文时,OS会找到另一个必须运行其代码的(最先)线程,并将其线程上下文结构的内容移至CPU寄存器。此后,上下文切换结束,CPU可以执行最新线程的代码,直到发生另一个上下文切换为止。

因此,同步上下文和线程上下文是两个非常不同的概念。线程上下文是一种低级结构,它允许OS在线程之间切换,而同步上下文是一种简化将工作项发送到不同上下文(主要是不同线程)的机制。