问候溢出者,
我正在使用 C# .Net 4。我想优先考虑我的代码的特定部分以利用并发性,而其他部分也只有在有空间(空闲内核)的情况下也可以这样做,否则它们应该切换到顺序执行(在调用者线程中),而不仅仅是被暂时阻塞。
我怎样才能做到这一点 ?关于该特定问题的任何近期读物?
如果没有可用的内核,Parallel.Invoke(...) 是否会在调用程序任务/线程中按顺序执行内容?
问候
问候溢出者,
我正在使用 C# .Net 4。我想优先考虑我的代码的特定部分以利用并发性,而其他部分也只有在有空间(空闲内核)的情况下也可以这样做,否则它们应该切换到顺序执行(在调用者线程中),而不仅仅是被暂时阻塞。
我怎样才能做到这一点 ?关于该特定问题的任何近期读物?
如果没有可用的内核,Parallel.Invoke(...) 是否会在调用程序任务/线程中按顺序执行内容?
问候
没有“免费线程”之类的东西。只有一个未使用的核心。您可以使用 Environment.ProcessorCount 简单地计算它们,并以此为基础制定线程策略。不利用 ThreadPool 通常是一个错误,它可以很好地跨内核分配 tp 线程。但它并不容易给你你所要求的,ThreadPool.GetAvailableThreads 是一个不断变化的数字。反正应该是。
根据我使用 F# 的经验,可以从核心应用程序代码之外控制/配置并发的使用。我希望 C# Async CTP 能够提供类似的功能。
自由线程是一个仅存在于.Net 线程池中的概念。你的意思可能是免费的CPU资源!?
如果您使用 new 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);
}
我的印象是并行框架根据物理可用性分配线程。http://msdn.microsoft.com/en-gb/concurrency/default.aspx
我可能正在考虑并行扩展(http://blogs.msdn.com/b/pfxteam/),或者它们可能是同一件事,或者我可能在说垃圾:-)
你的问题是优先级。您是说您有两种类型的任务:重要任务(必须运行)和休闲任务(只有在有空闲 CPU 并且没有重要任务排队时才能运行)。
简单的解决方案是为重要任务分配非常高的优先级,而为休闲任务分配非常低的优先级。这样,您几乎可以保证系统的大部分 CPU 资源都用于运行重要任务。但是,它并不能保证您的休闲任务总是在所有重要任务运行后运行。系统可能仍会偶尔安排一些休闲任务。
但是,任务并行库不允许调度具有不同优先级的任务。您可以使用类似的东西,也可以使用BlockingCollection 的自定义实现覆盖 TPL 的调度程序,该实现总是首先使重要任务出列。
一种解决方案是使用 TPL 安排您的重要任务,但在您自己的后台线程(设置为最低线程优先级)上手动安排您的休闲任务——并且该线程按顺序运行休闲任务。