Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

线程示例C#

线程示例C#,c#,multithreading,C#,Multithreading,我在网上找到了这本书。约瑟夫的《C#中的线程》。我试过它的例子 class ThreadTest { static void Main() { Thread t = new Thread(WriteY); // Kick off a new thread t.Start(); // running WriteY() // Simultaneously,

我在网上找到了这本书。约瑟夫的《C#中的线程》。我试过它的例子

class ThreadTest
{
    static void Main()
    {
        Thread t = new Thread(WriteY);          // Kick off a new thread
        t.Start();                               // running WriteY()

        // Simultaneously, do something on the main thread.
        for (int i = 0; i < 10000000; i++) Console.Write("x");
        Console.ReadLine();
    }
    static void WriteY()
    {
        for (int i = 0; i < 10000000; i++) Console.Write("y");
    }
}
类线程测试
{
静态void Main()
{
线程t=新线程(WriteY);//启动一个新线程
t、 Start();//正在运行WriteY()
//同时,在主线程上执行一些操作。
对于(inti=0;i<10000000;i++)控制台;
Console.ReadLine();
}
静态void WriteY()
{
对于(inti=0;i<10000000;i++)控制台;
}
}
问题是,当我运行这个程序时(我在循环中给出了更高的值以供观察),我的cpu利用率保持在100%。我不想这样,我的意思是,是否有任何方法可以减少这个程序的cpu密集度?我刚刚接触过多线程概念,所以我想我应该提前询问。

控制台之后添加
线程。睡眠(毫秒数)
。写入
,因为循环将充分利用cpu

class ThreadTest 
{
     static void Main()
     {
         Thread t = new Thread(WriteY);
          // Kick off a new thread
         t.Start();
         // running WriteY()
         // Simultaneously, do something on the main thread.
         for (int i = 0; i < 10000000; i++)
         {
              Console.Write("x");
              Console.ReadLine();     
         }
     }     

    static void WriteY()
    {
         for (int i = 0; i < 10000000; i++) 
         {
               Console.Write("y");
               Thread.Sleep(1000); // let the thread `sleep` for one seconds before running.     
         } 
    } 
}

如果可以同时使用多个资源,多线程可以改进应用程序。 例如,如果您有多个内核或多个CPU,我相信上面的示例应该表现得更好

或者,如果有一个线程使用CPU,另一个线程同时使用磁盘,那么如果使用多线程,它的性能也会更好


但是,如果您只有一个CPU或一个内核,那么上面的示例的性能不会更好。它的性能会更差。

您无法降低利用率,因为您使用的是两个线程(很可能在双核上),这两个线程都是工作密集型的(它们循环并打印某些内容)。也许降低线程优先级会有所帮助,但我认为这不是本例的重点。

WriteY函数中的循环将尽快执行。因此,它将使用100%的CPU。如果您希望it资源不那么密集,可以做两件事:

  • 更改线程的优先级。这样,您的应用程序仍将使用100%的CPU,但如果另一个线程需要CPU资源,该线程将“减速”

  • 在WriteY函数中添加暂停:

    static void WriteY()
    {
        for (int i = 0; i < 10000000; i++)
        { 
            Console.Write("y");
            Thread.Sleep(100);
        }
    }
    
    static void WriteY()
    {
    对于(int i=0;i<10000000;i++)
    { 
    控制台。写入(“y”);
    睡眠(100);
    }
    }
    

多线程的整体思想是通过使用更多的计算资源(线程,分布在内核之间)更快地完成任务,从而提高CPU利用率

如果你想降低你的CPU利用率,不要使用多线程,坚持你的程序使用单线程。它将运行更长的时间,但消耗更少的CPU(当然,有很多优化可以减少CPU占用,但它们与多线程无关)

如果您想监视网络中的300个节点,那完全是另一回事。您的示例在这里是错误的,因为您尝试计算密集型任务。网络监控不是计算密集型的,它由“请求-等待-处理-响应”循环组成,这些循环具有良好的并行性:即使一个CPU在等待另一个节点的响应时,也可以有效地处理来自一个节点的响应。更重要的是,因为网络等待实际上是一种i/o等待,所以这种等待可以很容易地卸载到操作系统中,这样就不会消耗CPU

里克特的《第三版C#via C#CLR》中有一个关于线程(和I/O等待)的好章节,我强烈建议您解决您的问题。

改变这一点:

for (int i = 0; i < 10000000; i++) Console.Write("x");
用于(inti=0;i<10000000;i++)控制台;
在此代码中:

for (int i = 0; i < 10000000; i++) 
    {
       Console.Write("x");
       Thread.Sleep(5);
    }
for(int i=0;i<10000000;i++)
{
控制台。写入(“x”);
睡眠(5);
}
使用


首先,尝试该程序的单线程等效程序。您可能会发现它也使用了您的一个内核的100%,甚至更多(假设您有多个内核,显然不可能超过100%/1)。示例代码是示例代码,通常在所有方面都不现实

很多问题都与100%的CPU利用率有关,因此人们可能会认为100%的CPU==坏东西

事实上,100%CPU==昂贵的电子产品正在做你花钱买来的工作

不幸的是,你花钱让它去做的,是按照计算机程序中的说明去做。如果一个计算机程序告诉它进入一个紧密的无限循环,那么它将花费尽可能接近100%的CPU来做这件事(不同的调度器在让其他线程做其他事情方面比其他调度器更好)。这是100%CPU的典型坏情况。是的,它正在做它被告知的事情,但是它被告知的事情是毫无意义的,永远不会结束,而且可悲的是,它是如此的“高效”,以至于它真的擅长于避免其他线程的干扰

我们考虑另一个例子:

  • 将要完成的工作量是有限的——在某个点上它已经完成了
  • 你没有其他你想让计算机做的事情
  • 这里越接近100%越好。每低于100%表示CPU正在等待某些事情发生。如果我们可以使“某些事情”更快地发生(可能是更快的磁盘和内存),或者如果我们可以让CPU处理问题的另一部分,那么我们将更快地到达完成点。因此,如果我们用多线程方法替换代码,让它在另一个线程等待时使用CPU,并且这样做的开销没有抵消这些好处,那么我们将获得性能提升。(同时,这意味着我们可以用所有核的x%替换使用一个核的x%,并且因此速度更快)

    现实地说,只有少数时候我们希望完成某项工作,而不关心其他任何事情。事实上,即使我们这样做了,我们也往往会被同时挂起的UI吓坏,忘记了“让它看起来不要被锁起来,永远不会回来”属于“其他任何东西”的范畴
    for (int i = 0; i < 10000000; i++) 
        {
           Console.Write("x");
           Thread.Sleep(5);
        }
    
    Thread.Sleep(x); //where x >= 0
    
    Thread.Yield();
    
    for(int i = 0; i<= 10000; i++)
    {
    
    }