【问题标题】:Task parallel Library mixed multithread and single threaded .net 4任务并行库混合多线程和单线程.net 4
【发布时间】:2014-07-29 05:43:48
【问题描述】:

我正在使用 tpl 以多线程方式处理数千个文件。一切都很好。

但是应用程序的某些部分我必须单线程处理这些文件。

设置 maxdegreeParallelism=1 表示 1 线程 x 核心这样对吗?

当你没有并行性并且你有 4 个核心时,它仍然使用 1 个线程 x 核心吗?

问题是 tpl 为您做了很多艰苦的工作,而且对线程不太熟悉也无济于事。

我需要确保 maxdegreeParallelism=1 是单线程的

很抱歉这个愚蠢的问题,但无法通过谷歌搜索找到直接答案。

【问题讨论】:

  • 您可以通过澄清您正在使用的类型以及您将maxdegreeParallelism=1 设置为什么来改进您的问题。

标签: multithreading c#-4.0 task-parallel-library


【解决方案1】:

见here。

没有。当你设置“MaxDegreePrallelism”时,并不是每个核心必须运行一个线程。它有不同的含义。它限制了整个并行操作中完成的并行任务的数量。如果设置为1,基本上使您的并行方法毫无用处。

TPL 在线程池上调度一个任务。一旦任务被调度,线程池将决定如何在线程、内核和处理器之间分配所有要完成的任务。这是基于某些启发式方法,例如虚拟地址空间、当前处于阻塞状态的线程数等。

现在,如果您的意思是应用程序的一部分中的任务应该以顺序的形式完成,那么有一些方法可以实现这一点。看看ContinueWith。

【讨论】:

  • 嗨,我完全放弃了回复。感谢您的时间。让我做对了。设置 MaxDegreeParallelism=1 它实际上将运行单线程,正如您所说,它将使 TPL 无用。在某种程度上,这实现了我在短期内想要做的事情,直到我读到更多关于 ContinueWith 的内容。你是说使用 continueWith 我可以并行执行一些部分和一些顺序?有什么例子吗?非常感谢
  • 好吧,您对问题的定义可能过于笼统,无法做出正确的回应,但是是的。使用“ContinueWith”,您可以将一堆任务排队,然后在所有先前的并行任务完成后让程序 ContinueWith 另一个任务。以here 为例。
【解决方案2】:

Documentation 没有说任何关于 CPU-Cores 的内容,而是 并发 操作。 所以这意味着,设置为 1 等于总共 1 个线程。虽然它与调用线程是不同的线程。

Fiddle to poorly prove assumption.

【讨论】:

  • 嗨,感谢您的回复,您所说的“1”将运行一个线程,无论您有多少 CPU,但不是在主线程上而是在后台线程上。您就是这样吗说什么?
  • 是的“虽然它是与调用线程不同的线程。”
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 2011-09-29
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2011-04-08
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多