关于c#:线程上下文和同步上下文

Thread Context and Synchronization Context

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

The thread context includes all the information the thread needs to
seamlessly resume execution, including the thread's set of CPU
registers and stack, in the address space of the thread's host
process.

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


同步上下文和线程上下文是两个非常不同的事物。同步上下文是一种可以将工作单元排队到上下文(主要是不同的线程)的方法。这是一个报价。

One aspect of SynchronizationContext is that it provides a way to
queue a unit of work to a context. Note that this unit of work is
queued to a context rather than a specific thread. This distinction is
important, because many implementations of SynchronizationContext
aren’t based on a single, specific thread.

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

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

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