【问题标题】:Task Thread Context Switches任务线程上下文切换
【发布时间】:2012-01-12 19:33:54
【问题描述】:

我在四处阅读并了解到,如果我在 .Net 中使用任务而不是线程,它们将不会受到线程存在问题的上下文切换的影响。

不过,我也注意到,Tasks 只是在幕后使用线程。

所以我有点困惑,感谢任何澄清。

【问题讨论】:

  • 也许您应该发布您发现的提供错误信息的 URL。

标签: .net multithreading task context-switch


【解决方案1】:

你读错了。

Task 是 TPL 的一部分。 TPL 使用比 CLR 的线程池更高级的调度程序。一个例子是 TPL 调度器使用WorkStealingQueues

几个事实:

  • 无论您使用Task.Factory.StartNew 还是ThreadPool.QueueUserWorkItem,两者都将使用相同的线程池 (.NET 4.0)
  • 无论您使用Task 还是“原始”线程,每个时间片都会导致上下文切换。
  • 此外,如果更高优先级的线程变为可运行,则会导致上下文切换。
  • Task 将导致与常规线程一样多的上下文切换。

请注意,只有在没有足够的处理器同时处理线程时才会发生上下文切换。

一些要查看的链接:

【讨论】:

    【解决方案2】:

    上下文切换不是线程固有的,而是线程滥用所固有的。任务以这样一种方式使用线程,即任何正在运行的线程都可以执行任何需要完成的任务,从而避免了线程被滥用时发生的代价高昂的上下文切换。

    【讨论】:

    • “上下文切换不是线程固有的”?自从我年轻时,世界就发生了变化。
    • 或者,也许,当操作系统决定它想要做其他事情而不是运行你的四个线程时?
    • 线程是唯一上下文切换的东西。进程的线程可以进行上下文切换,但进程不会。流程在哪里进入讨论?问题是关于线程和任务的。
    • 我不知道你是不是故意误解我的意思,但问题的上下文是多线程以及这是否会导致额外的上下文切换。我认为您是故意孤立我的第一句话,而忽略了这是对问题的回应,并在接下来的句子中进一步澄清。
    • 顺便问一下,有没有不使用抢占的操作系统呢?你的说法有点学术。
    猜你喜欢
    • 2014-12-05
    • 2011-07-23
    • 1970-01-01
    • 2017-09-09
    • 2011-07-27
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多