当上下文切换发生时,线程将保持相同的数字?

时间:2016-11-14 11:58:17

标签: c# task-parallel-library task

我对使用任务有疑问。

我写了以下代码:

static void Main(string[] args)
{
    Task t = new Task(() => DoWork());
}

private static void DoWork()
{
    //Do Something
}

DoWork在ThreadPool的线程上运行。 例如,假设线程数为3。

我的问题: 在功能DoWork的中间有选项,因为上下文切换等', 函数的连续性将在不是3的线程中吗?

感谢!

2 个答案:

答案 0 :(得分:4)

  

我的问题:在函数DoWork的中间有选项,由于上下文切换等等,函数的连续性将在非3的线程中?

不,上下文切换并不意味着它转到不同的线程,只是处理器核心占用了不同的线程/逻辑来处理,这个仍然在同一个线程上。大多数线程具有相同的优先级,除非由GC或OS等CLR调度,这将优先于其他线程并冻结所有其他线程。休息所有必须在经过一些逻辑处理之后继续离开处理器核心,或者我必须说处理器核心(线程调度逻辑)继续调度其他线程,因此不会使其中任何一个线程不足。 请注意,在给定时间,处理器核心只能安排一个线程/工作单元

答案 1 :(得分:4)

  

我的问题:在功能DoWork的中间有选项,   因为上下文切换等',函数的连续性将是   在不是3的线程中?

没有。从分配线程池的线程到运行代码DoWork的那一刻起,该线程将执行代码,当线程完成其工作时,将返回到包含其他应该是的工作的队列。运行以获取下一个,如果有的话。

关于上下文切换,它不会发生在线程中,而是发生在两个线程之间。 CPU中的每个核心一次只能执行一个线程的时间片。当一个线程的工作尚未在给定时间片中完成时,您有一个上下文切换。因此必须暂停并且为其时间片执行另一个线程。然后线程调度程序将调度暂停的线程在另一个时间运行。