Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程并行编程实例_C#_Multithreading_Parallel Processing - Fatal编程技术网

C# 多线程并行编程实例

C# 多线程并行编程实例,c#,multithreading,parallel-processing,C#,Multithreading,Parallel Processing,因此,我认为我理解并行编程和多线程的概述概念,但我想知道您是否可以实现多进程多线程应用程序。如果这是有意义的话,当查看多线程的一些描述时,它可以在一个处理器上运行,但是如果您可以使用并行在多个核上处理,那么您也可以在多个核上运行多线程吗?如果可以的话,有人能给我举个简单的例子,使用for循环吗 多线程示例: public class Test { static void Main() { Counter foo = new Counter(); T

因此,我认为我理解并行编程和多线程的概述概念,但我想知道您是否可以实现多进程多线程应用程序。如果这是有意义的话,当查看多线程的一些描述时,它可以在一个处理器上运行,但是如果您可以使用并行在多个核上处理,那么您也可以在多个核上运行多线程吗?如果可以的话,有人能给我举个简单的例子,使用
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);
        }
    }
}

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

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


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

不是并行的。要了解为该循环生成线程的快捷方式,您可以在这里和在线搜索中找到很多这样的示例。例如,我的系列文章:很容易找到C#threading…那么我是否应该在C#development的上下文中学习并行呢?@KirstyWhite
parallel.For
是.NET中的一个内置速记,它使程序员不再需要显式地创建工作线程或使用.NET线程池。而在单个线程的上下文中,
Parallel.For
将旋转出循环,在线程池上并行执行迭代,而不是在调用线程上按顺序执行迭代。这带来了一个限制,即循环必须是线程安全的,并且必须相互独立(即:不依赖于以前迭代的结果)。这是一种在不显式生成新线程的情况下执行循环的简单方法。@KirstyWhite在任何情况下,您都应该了解它-您是否决定将其用于任何给定的问题更多地取决于手头算法的复杂性和性质。在某些情况下,
并行。因为
是加速循环的好方法,而在另一些情况下,应用程序可能已经是多线程的,因此最好跨线程细分较大的任务。这真的取决于你试图解决什么问题。也许这就是我困惑的地方,我认为并行。因为是告诉它使用多核,而不仅仅是多线程的另一种方式。我需要进一步了解并行编程与多线程的区别。@KirstyWhite是的,这只是达到同一目的的不同方法。线程本质上是平行的。一个线程一次只能做一件事,一次只能在一个内核上运行。但是,所有正在运行的线程都将使用系统上可用的任何内核,无论您使用何种方法创建它们,或者作为显式新线程,或者作为分配给线程池的任务,或者通过类似于
Parallel.For
的方式。
int n = ...
Parallel.For(0, n, i =>
{
   // ... 
});