使用多线程的并行编程示例

4

我觉得我理解了并行编程和多线程的概念,但我想知道是否可以实现多进程多线程的应用程序。如果可以的话,当查看一些多线程的描述时,它可以在一个处理器上运行,但如果您可以使用并行在多个核心上进行处理,那么您也可以在多个核心上进行多线程处理吗?如果可以的话,有没有人能给我展示一个简单的示例,使用for循环可能会更好理解?

多线程示例:

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不就是为了快速生成循环线程的捷径吗? - CookieOfFortune
1
你可以在这里或者在线搜索到很多相关的例子。比如,我的系列文章:http://reedcopsey.com/series/parallelism-in-net4/ 很容易找到关于C#线程的内容... - Reed Copsey
1个回答

2
可用逻辑CPU的任务分配是操作系统的任务。如果编写多线程应用程序,操作系统将管理将各个线程分配到系统中的硬件处理器。作为程序员,您无需采取任何措施使其发生。
但是,您可以直接管理此过程-将特定线程与运行在特定核心或逻辑处理器子集上关联,但通常这比允许操作系统管理硬件分配效率低,因为它对运行在系统上的所有进程具有更广泛的意识,并且在大多数情况下以最有效的方式处理分配。
简而言之,如果您的应用程序是多线程的,则它将在系统提供的所有可用核心上运行。

2
@KirstyWhite Parallel.For 是 .NET 中的内置简写,它使程序员无需显式创建工作线程或利用 .NET 线程池。在单个线程的上下文中,Parallel.For 将会将循环分离出来,在线程池上并行执行迭代,而不是在调用线程上按顺序执行。这带来了一个限制,即循环必须是线程安全的,并且必须是相互独立的(即不依赖于先前迭代的结果)。这是一种在不显式创建新线程的情况下对循环进行线程化的简单方法。 - J...
@KirstyWhite 你肯定应该学习它,无论如何 - 是否决定在任何给定的问题中使用它更取决于算法的复杂性和性质。在某些情况下,Parallel.For是加速循环的好方法,在其他情况下,如果应用程序已经非常多线程化,将较大的任务分成几个线程可能会更好。这真的取决于你试图解决什么问题。 - J...
1
@KirstyWhite 是的,这只是不同的方式达到相同的目的。线程本质上是并行的。一个线程一次只能做一件事情,并且一次只能在一个核心上运行。然而,所有正在运行的线程都将利用系统上可用的任何核心,无论您使用什么方法来创建它们,无论是作为显式新线程、作为分配给线程池的任务,还是通过类似于“Parallel.For”的东西。 - J...
谢谢J,我认为我应该关注并行而不是多线程,因为我想要一个更快、更高效的程序。我有这样的印象,多线程在.NET中是一种较旧的做法?只是不确定从哪里开始。 - Kirsty White
@KirstyWhite 不,多线程是非常合适的做事方式。就像我说的,这取决于手头的任务。Parallel.For适用于小型、封闭的任务。它是较新的方法,更容易地将小任务分配到线程中,但在更大或更复杂的应用程序上下文中,它绝不是重型多线程的替代品。它只是工具箱中的另一种工具。有时你需要螺丝刀,有时你需要钻锤。这取决于你在做什么。建议您阅读上面Reed的链接。 - J...
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接