【问题标题】:TPL Tasks, Threads, etcTPL 任务、线程等
【发布时间】:2011-06-01 03:41:11
【问题描述】:

有人可以向我解释一下这些事情是如何关联的吗:

任务
线程
ThreadPool的线程
并行.For/ForEach/Invoke

即当我创建一个任务并运行它时,它在哪里得到一个线程来执行?当我调用 Parallel.* 时,幕后究竟发生了什么?

也非常欢迎任何文章、博客文章等的链接!

【问题讨论】:

  • 好书,Windows 上的并发编程,很好读,至少到目前为止我已经完成了一半;-)

标签: multithreading task threadpool task-parallel-library


【解决方案1】:

线程:是真正的操作系统线程,有句柄和ID。

ThreadPool: 是已创建的操作系统线程的集合。这些线程由运行时拥有/维护,你的代码只允许“借用”它们一段时间,你只能在这些线程中做短期工作,你不能修改任何线程状态,也不能删除这些线程。

对这两个的最佳猜测:

任务: 可能会在线程池中预先创建的线程上运行,或者可能会作为用户模式调度的一部分运行,这完全取决于运行时认为什么是最好的。另一个猜测:使用 TPL,用户模式调度不是基于 OS Fibers,而是它自己的完整(和工作)实现。

Parallel.For: 实际上,不知道这是如何实现的。运行时可能会创建新线程来执行并行位,或者更有可能使用线程池的线程进行并行处理。

【讨论】:

    【解决方案2】:

    系统的理想状态是每个 CPU 内核有 1 个活跃运行的线程。通过以更一般的“任务”术语定义工作,TPL 可以动态地决定使用多少线程以及在每个线程上执行哪些任务,以最接近于实现理想状态。这些决策几乎总是最好在运行时动态做出,因为在编写代码时,您无法确定有多少 CPU 内核可供您的应用程序使用,它们忙于其他工作等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-23
      • 2014-09-17
      • 2017-11-11
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多