是否可以同时在多个线程中运行500个不同的操作?

时间:2012-11-16 12:53:00

标签: c# multithreading algorithm

我有一个包含500个对象的列表。对于每个对象,我正在调用一个函数来计算它的成本。因此,500个呼叫中的每一个都独立于其他呼叫。整体大约需要30秒。是不是可以同时运行所有500个任务,因为它们不相互依赖?我对多线程一无所知,因此我不知道它是不是一个解决方案。

6 个答案:

答案 0 :(得分:3)

您可以使用Parallel.ForEach Method

轻松地并行化工作
Parallel.ForEach(items, item =>
{
    item.CalculateCost();
});

答案 1 :(得分:3)

运行单线程进程只会使用你机器的一个核心(这确实允许其他核心运行操作系统和其他应用程序进程)。

您的过程听起来是多线程处理的有力竞争者,但是您不需要为每个进程创建新线程 - 这会在创建线程时产生开销,而且您还没有足够的核心可以单独运行它们,因此它们将争夺CPU资源。

在.Net4.0中使用Parallel.For将巧妙地使用尽可能多的线程。

答案 2 :(得分:2)

使用Task Parallel Library为每个对象启动单个任务。在任务中,您可以调用该函数来计算它的成本。

答案 3 :(得分:2)

  

难道不能同时运行所有500个任务,因为它们不相互依赖吗?

简而言之,是的,如果您有500个核心(CPUs

线程之间的

Switching the context是一个非常昂贵的过程,涉及挂起当前线程,这就是为什么每个CPU运行一个线程更有效。

自C#4.0起,您可以使用Task Parallel LibraryParallel LINQ (PLINQ),这样可以简化Parallel Programming in the .NET Framework

// IEnumerable<MyClass> items = ...

var results = items

  // Enables parallel execution of the query
  .AsParallel()

  // Specifies the method for creating values
  .Select(item => Calculate(item))

  // Waits for calculating all the values and returns the result (as an array)
  .ToArray(); 

答案 4 :(得分:1)

尝试Parallel.ForEach

你可以在这里看到一个例子: How to: Write a Simple Parallel.ForEach Loop

答案 5 :(得分:0)

你可以旋转500个线程 - 是的。他们会同时进行 - 不。话虽这么说,不幸的是,使用的最佳线程数比每个核心的线程更复杂。

例如,英特尔处理器每个核心有两个执行流水线(称为u和v),允许无序处理,根据条件,可以比顺序处理这两条指令更快地执行两条指令。问题是执行管道确实在核心内共享一些资源。他们分享:

缓存,分支预测资源,指令获取和解码以及执行单元。

这意味着执行两条指令的效率取决于缓存未命中和分支预测未命中等。优点在于,在等待高延迟操作时指令阻塞(例如,在高速缓存未命中时将存储器的内容提取到高速缓存中),如果在另一个管道中存在另一指令,则可以在等待时进行处理。这绝对不比两个单独的内核快,但通常比顺序指令处理更快(平均大约快25%)。

要记住的另一件事是操作系统还需要一些时间在处理器上执行。 Microsoft建议最高线程进行高效处理,每个逻辑核心有25个线程(每个物理核心有1个逻辑核心没有超线程,每个物理核心有2个HT)(这是IIS中每个核心的默认最大线程数)。然而,应该指出,这是一个“经验法则”。找到真正最佳的唯一方法是在给定的软件/硬件设置上进行测试。然而,优化硬件在实践中是不实际的,不推荐,因此需要“经验法则”。