【问题标题】:An example of parallel programming with multithreading多线程并行编程示例
【发布时间】:2013-03-29 22:58:48
【问题描述】:

所以我想我了解并行编程和多线程的概述概念,但我想知道是否可以实现多进程多线程应用程序。如果这是有道理的,那么在查看多线程的一些描述时,它可以在一个处理器上运行,但如果您可以使用并行处理多个内核,您是否也可以在多个内核上进行多线程处理?如果可以的话,有人可以给我看一个简单的例子吗,使用for loop 可能吗?

多线程示例:

public class Test
{
    static void Main()
    {
        Counter foo = new Counter();
        ThreadStart job = new ThreadStart(foo.Count);
        Thread thread = new Thread(job);
        thread.Start();

        for (int i=0; i < 5; i++)
        {
            Console.WriteLine ("Main thread: {0}", i);
            Thread.Sleep(1000);
        }
    }
}

public class Counter
{
    public void Count()
    {
        for (int i=0; i < 10; i++)
        {
            Console.WriteLine ("Other thread: {0}", i);
            Thread.Sleep(500);
        }
    }
}

并行示例:

int n = ...
Parallel.For(0, n, i =>
{
   // ... 
});

【问题讨论】:

  • 不是 Parallel.For 只是为该循环生成线程的快捷方式吗?
  • 您可以在此处和在线搜索中找到很多这样的示例。例如我的系列:reedcopsey.com/series/parallelism-in-net4 很容易找到 C# 线程...

标签: c# multithreading parallel-processing


【解决方案1】:

将任务分配到可用的逻辑 CPU 是操作系统的任务。如果您编写多线程应用程序,操作系统将管理将各种线程分配给系统中的硬件处理器。作为程序员,您无需做任何事情来实现这一点。

但是,您可以直接管理它 - 将特定线程关联到在特定核心或逻辑处理器子集上运行,但通常这比允许操作系统管理硬件分配效率低,因为它对所有进程有更广泛的认识在系统上运行,并且在大多数情况下以最有效的方式处理分配。

简而言之,如果您的应用程序是多线程的,那么它在系统提供的尽可能多的可用内核上运行。

【讨论】:

  • 我应该在 C# 开发的背景下学习并行吗?
  • @KirstyWhite Parallel.For 是 .NET 中的内置简写,它使程序员无需显式创建工作线程或使用 .NET 线程池。而在单个线程的上下文中,Parallel.For 将退出循环,在线程池上并行执行迭代,而不是在调用线程上按顺序执行。这带有循环必须是线程安全的并且必须相互独立的限制(即:不依赖于先前迭代的结果)。这是一种无需显式创建新线程即可线程化循环的简单方法。
  • @KirstyWhite 你当然应该了解它,无论如何 - 你是否决定将它用于任何给定的问题更多地取决于手头算法的复杂性和性质。在某些情况下,Parallel.For 是加速循环的好方法,而在其他情况下,应用程序可能已经是大量多线程的,最好跨线程细分更大的任务。这实际上取决于您要解决的问题。
  • 也许这就是我困惑的地方,我认为 Parallel.for 是在告诉它使用多个内核,而不仅仅是另一种多线程方式。我需要进一步了解并行编程与多线程的区别。
  • @KirstyWhite 是的,这只是达到同一目的的不同方式。线程本质上是并行的。一个线程一次只能做一件事,并且一次只能在一个内核上运行。但是,所有正在运行的线程都将使用系统上可用的任何内核,无论您使用什么方法来创建它们,无论是作为显式的新线程,作为分配给线程池的任务,还是通过类似 Parallel.For 的东西。