条件并发(将并发与顺序混合)

时间:2011-03-26 17:30:45

标签: c# .net concurrency sequential

问候Overflowers,

我正在使用C#.Net 4。 我想优先考虑我的代码的特定部分以利用并发性,而其他部分也可以在有空间(免费核心)时也这样做,否则他们应该切换到顺序执行(在调用程序线程中)而不是暂时受阻。
我怎样才能做到这一点 ?最近有关于该特定问题的最佳读物吗? 如果没有核心可用,那么Parallel.Invoke(...)在调用者任务/线程中按顺序执行东西吗?

此致

5 个答案:

答案 0 :(得分:1)

没有“免费线程”这样的东西。只有一个未使用的核心。您可以使用Environment.ProcessorCount简单地计算它们,并以此为基础进行线程化策略。不利用ThreadPool通常是一个错误,它在核心上分配tp线程方面做得很好。但它并不容易给你你所要求的东西,ThreadPool.GetAvailableThreads是一个不断变化的数字。无论如何应该是。

答案 1 :(得分:0)

我的印象是并行框架基于物理可用性分发了线程。 http://msdn.microsoft.com/en-gb/concurrency/default.aspx

我可能会想到并行扩展(http://blogs.msdn.com/b/pfxteam/),或者它们可能是同一个东西,或者我可能在谈论垃圾: - )

答案 2 :(得分:0)

根据我使用F#的经验,可以从核心应用程序代码之外控制/配置并发使用。我希望C#Async CTP能够提供类似的功能。

答案 3 :(得分:0)

自由线程是一种仅存在于.Net线程池中的概念。您的意思可能是免费的CPU资源!?

如果您使用新的Thread()声明自己的线程,则不受它的约束。

然而,产生很多它们可能会减慢过程甚至操作系统。 这就是为什么你应该让自己的线程管理器来处理这个问题。

您可以检查CPU使用情况:

PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
double cpuUsage = Convert.ToDouble(cpuCounter.NextValue());

然后在你的代码中使用变量来执行:

int threadId;
if (cpuUsage > threshold) {
    DoWork();
}
else {
    threadId = YourThreadManager.Queue(DoWork);
}

答案 4 :(得分:0)

你的问题是优先次序。您说您有两种类型的任务:重要任务(必须运行)和休闲任务(只有在有空闲CPU并且没有重要任务排队时才能运行)。

简单的解决方案是为重要任务分配非常高优先级,为休闲任务分配非常低优先级。这样,您几乎可以保证系统的大部分CPU资源都用于运行重要任务。但是,在运行所有重要任务之后,它 确保您的休闲任务始终运行。系统可能仍会在一段时间内安排一些休闲任务。

但是,任务并行库不允许调度具有不同优先级的任务。您可以使用something like this或使用BlockingCollection的自定义实现覆盖TPL的调度程序,该实现始终首先使重要任务出列。

一种解决方案是使用TPL安排重要任务,但在您自己的后台线程上手动安排休闲任务(设置为最低线程优先级) - 此线程按顺序运行休闲任务。