色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是多線程

汽車電子技術(shù) ? 來源:程序猿知秋 ? 作者:程序猿知秋 ? 2023-02-28 09:56 ? 次閱讀

圖片

基本概念

線程

  • 被定義為程序的執(zhí)行路徑,也叫執(zhí)行單元
  • 線程是輕量級進程;使用線程節(jié)省了 CPU 周期的浪費,同時提高了應(yīng)用程序的效率

進程

  • 是Windows系統(tǒng)中的一個基本概念,它包含著一個運行程序所需要的資源。一個正在運行的應(yīng)用程序在操作系統(tǒng)中被視為一個進程
  • 一個進程可以包括一個或多個線程, 注:至少得有一個線程
  • 進程之間是相對獨立的,一個進程無法訪問另一個進程的數(shù)據(jù)

查看當(dāng)前系統(tǒng)中的進程

打開任務(wù)管理器,查看當(dāng)前運行的進程

圖片編輯

查看當(dāng)前系統(tǒng)中的線程

在任務(wù)管理器里面查詢當(dāng)前總共運行的線程數(shù)

圖片編輯

并行與串行(異步與同步)

  • 并行(異步): 多個線程同時執(zhí)行任務(wù)
    • 舉例:小明在燒開水的同時去洗菜了
  • 串行(同步): 一個任務(wù)執(zhí)行完后才能執(zhí)行下一個
    • 舉例:小明在燒開水,等開水燒開后再去洗菜

線程的生命周期

  • 新建 :當(dāng)線程實例被創(chuàng)建但 Start 方法未被調(diào)用時的狀況
  • 就緒 :當(dāng)線程準(zhǔn)備好運行并等待 CPU 調(diào)度
  • 不可運行 :下面的幾種情況下線程是不可運行的:
    • 已經(jīng)調(diào)用 Sleep 方法
    • 已經(jīng)調(diào)用 Wait 方法
    • 通過 I/O 操作阻塞
  • 死亡狀態(tài) :當(dāng)線程已完成執(zhí)行或已中止時的狀況

主線程

  • 一個進程可以包含若干個線程,在進程入口執(zhí)行的 第一個線程被視為這個進程的主線程
  • C# 中,都是以Main()方法作為入口的,當(dāng)調(diào)用此方法時系統(tǒng)就會自動創(chuàng)建一個主線程。
  • 在 C# 中,System.Threading.Thread 類用于線程的工作。它允許創(chuàng)建并訪問多線程應(yīng)用程序中的單個線程
  • 可以使用 Thread 類的 CurrentThread 屬性訪問線程。

舉例:主線程執(zhí)行

internal class ThreadTest
{
  static void Main(string[] args)
  {
    Thread th = Thread.CurrentThread;
    th.Name = "MainThread";
    Console.WriteLine("線程ID是:{0},線程名稱是:{1}", th.ManagedThreadId, th.Name);
  }
}

輸出結(jié)果

線程ID是:1,線程名稱是:MainThread

**多線程的創(chuàng)建與管理 **

創(chuàng)建

  • 線程是通過擴展 Thread 類創(chuàng)建的,然后在構(gòu)造方法中傳入委托對象。擴展的 Thread 類調(diào)用 Start() 方法來開始子線程的執(zhí)行
  • **子線程不需要傳參使用 **ThreadStart
internal class ThreadTest
{
  static void Main(string[] args)
  {
    // 創(chuàng)建兩個子線程
    Thread t1 = new Thread(new ThreadStart(PrintStr));
    Thread t2 = new Thread(new ThreadStart(PrintStr));
    t1.Start();
    t2.Start();
  }


  private static void PrintStr()
  {
    Thread th = Thread.CurrentThread;
    Console.WriteLine("線程ID是:{0}", th.ManagedThreadId);
  }
}

輸出結(jié)果

線程ID是:7
線程ID是:6

通過ThreadStart 源碼,可以看到它其實是一個委托

圖片編輯

  • 如果要向子線程中傳遞參數(shù)則需要使用: ParameterizedThreadStart
  • 注意:ParameterizedThreadStart委托的參數(shù)類型必須是Object的
internal class ThreadTest
{
  static void Main(string[] args)
  {
    // 創(chuàng)建兩個子線程
    Thread t1 = new Thread(new ParameterizedThreadStart(PrintStrParam));
    Thread t2 = new Thread(new ParameterizedThreadStart(PrintStrParam));
    t1.Start("我是有參數(shù)1");
    t2.Start("我是有參數(shù)2");
  }


  private static void PrintStrParam(Object obj)
  {
    Thread th = Thread.CurrentThread;
    Console.WriteLine("線程ID是:{0},參數(shù)是:{1}", th.ManagedThreadId,obj);
  }
}

輸出結(jié)果

線程ID是:6,參數(shù)是:我是有參數(shù)1
線程ID是:7,參數(shù)是:我是有參數(shù)2

線程的管理與銷毀

  • Thread 類提供了各種管理線程的方法,下面演示sleep() 方法的使用,用于在一個特定的時間暫停線程
  • Abort() 方法用于銷毀線程;通過拋出 threadabortexception 在運行時中止線程。這個異常不能被捕獲,如果有 finally 塊,控制會被送至 finally 塊。 注:這個方法被標(biāo)記過時了,雖然依舊可以使用,但推薦使用 CancellationToken 來代替
internal class ThreadTest
{
  static void Main(string[] args)
  {
    // 創(chuàng)建兩個子線程
    Thread t1 = new Thread(new ThreadStart(printSleep));
    t1.Start();
    // 主線程睡眠 1 秒
    Thread.Sleep(1000);


    // 銷毀線程
    try
    {
      t1.Abort();
    }
    catch (ThreadAbortException e)
    {
      Console.WriteLine("進catch了嗎???");
    }
    finally
    {
      Console.WriteLine("進finally了嗎???");
    }
  }


  private static void printSleep()
  {
    for (int i = 0; i < 10; i++)
    {
      // 睡眠 500 毫秒
      Thread.Sleep(500);
      Console.WriteLine("輸出數(shù)字:{0}", i);
    }
  }
}

輸出結(jié)果

輸出數(shù)字:0
Unhandled exception. 輸出數(shù)字:1
System.PlatformNotSupportedException: Thread abort is not supported on this platform.
輸出數(shù)字:2
進finally了嗎???

線程同步與鎖

  • 所謂同步:是指在某一時刻只有一個線程可以訪問變量。
  • 如果不能確保對變量的訪問是同步的,就會產(chǎn)生錯誤。比如:兩個人同時賣一個倉庫中的同種 手機,如果不控制就可能出現(xiàn) 超賣現(xiàn)象 (即賣出的大于庫存的)
  • c#為同步訪問變量提供了一個非常簡單的方式,即使用c#語言的關(guān)鍵字 **Lock**,它可以把一段代碼定義為互斥段,互斥段在一個時刻內(nèi)只允許一個線程進入執(zhí)行

lock塊語法:

  • 需要注意,傳給**lock塊**的參數(shù)不能是值類型和string類型,必須是除了string外的引用類型,而且這個引用類型對象必須是所有線程都能訪問到的,否則鎖不住。
  • 如果你想保護一個類的實例,一般地,你可以使用this;
  • 如果你想保護一個靜態(tài)變量(如互斥代碼段在一個靜態(tài)方法內(nèi)部),一般使用類名就可以了
  • 也可以單獨創(chuàng)建一個object對象來作為指定的鎖對象

語法如下:

lock(expression)
{
   // 代碼邏輯
}

加鎖前案例

internal class ThreadTest
{
  static void Main(string[] args)
  {
    PhoneSale phone=new PhoneSale();


    // 創(chuàng)建兩個子線程
    Thread t1 = new Thread(new ThreadStart(phone.SalePhone));
    Thread t2 = new Thread(new ThreadStart(phone.SalePhone));
    t1.Start();
    t2.Start();
  }


}


public class PhoneSale
{
  // 數(shù)量
  private int num = 1;


  public void SalePhone()
  {
    if (num > 0)
    {
      Thread.Sleep(100);
      num--;
      Console.WriteLine("賣出一部手機,還剩下 {0} 個",num);
    }
    else
    {
      Console.WriteLine("賣完了....");
    }
  }
}

輸出結(jié)果

賣出一部手機,還剩下 0 個
賣出一部手機,還剩下 -1 個

**加鎖后案例

**

internal class ThreadTest
{
  static void Main(string[] args)
  {
    PhoneSale phone=new PhoneSale();


    // 創(chuàng)建兩個子線程
    Thread t1 = new Thread(new ThreadStart(phone.SalePhone));
    Thread t2 = new Thread(new ThreadStart(phone.SalePhone));
    t1.Start();
    t2.Start();
  }


}


public class PhoneSale
{
  // 數(shù)量
  private int num = 1;


  public void SalePhone()
  {
    lock (this)
    {
      if (num > 0)
      {
        Thread.Sleep(100);
        num--;
        Console.WriteLine("賣出一部手機,還剩下 {0} 個", num);
      }
      else
      {
        Console.WriteLine("賣完了....");
      }
    }
  }
}

輸出結(jié)果

賣出一部手機,還剩下 0 個
賣完了....

多線程的優(yōu)缺點

優(yōu)點

  • 可以同時完成多個任務(wù),使程序的響應(yīng)速度更快
  • 多線程技術(shù)解決了多部分代碼同時執(zhí)行的需求,能夠更好的利用cpu的資源
  • 可以設(shè)置每個任務(wù)的優(yōu)先級以優(yōu)化程序性能

缺點

  • 線程需要占用內(nèi)存,線程越多,占用內(nèi)存也越多
  • 多線程需要協(xié)調(diào)和管理,所以需要占用CPU時間以便跟蹤線程
  • 線程之間對共享資源的訪問會相互影響,必須解決爭用共享資源的問題
  • 線程太多會導(dǎo)致控制太復(fù)雜

為什么程序可以多線程執(zhí)行呢? 程序中的多線程與CPU的多線程有什么關(guān)系?

  • 目前電腦都是多核多CPU的,一個CPU在同一時刻只能運行一個線程,但是多個CPU在同一時刻就可以運行多個線程。

  • 線程的最大并行數(shù)量上限是CPU核心的數(shù)量,但是,往往電腦運行的線程的數(shù)量遠(yuǎn)大于CPU核心的數(shù)量,所以還是需要CPU時間片的切換

  • CPU運行速度太快,硬件處理速度跟不上,所以操作系統(tǒng)進行分 ** 時間片

    管理** 。這樣,從宏觀角度來說是多線程并發(fā)的,因為CPU速度太快,察覺不到,看起來是同一時刻執(zhí)行了不同的操作

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10854

    瀏覽量

    211590
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3541

    瀏覽量

    88628
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3785

    瀏覽量

    81005
收藏 人收藏

    評論

    相關(guān)推薦

    Java多線程的用法

    本文將介紹一下Java多線程的用法。 基礎(chǔ)介紹 什么是多線程 指的是在一個進程中同時運行多個線程,每個線程都可以獨立執(zhí)行不同的任務(wù)或操作。 與單線程
    的頭像 發(fā)表于 09-30 17:07 ?947次閱讀

    多線程技術(shù)在串口通信中的應(yīng)用

            首先介紹了多線程技術(shù)的基本原理,然后討論了多線程技術(shù)在串口通信中的應(yīng)用,并給出了實現(xiàn)的方法和步驟。關(guān)鍵詞:多線程;串口通信;事件
    發(fā)表于 09-04 09:10 ?18次下載

    Windows多線程編程

    計算機上的上位機制作工具語言之Windows多線程編程,感興趣的可以看看。
    發(fā)表于 09-01 15:27 ?0次下載

    多線程集合及IO面試

    多線程集合及IO面試
    發(fā)表于 02-27 19:11 ?0次下載

    多線程與聊天室程序的創(chuàng)建

    多線程程序的編寫,多線程應(yīng)用中容易出現(xiàn)的問題。互斥對象的講解,如何采用互斥對象來實現(xiàn)多線程的同步。如何利用命名互斥對象保證應(yīng)用程序只有一個實例運行。應(yīng)用多線程編寫網(wǎng)絡(luò)聊天室程序。
    發(fā)表于 05-16 15:22 ?0次下載

    設(shè)計多線程和多核系統(tǒng)

    如果您的微控制器應(yīng)用程序需要處理數(shù)字音頻,請考慮采用多線程方法。使用多線程設(shè)計方法可以使設(shè)計者以簡單的方式重用其部分設(shè)計。
    發(fā)表于 08-14 15:42 ?9次下載
    設(shè)計<b class='flag-5'>多線程</b>和多核系統(tǒng)

    linux多線程編程技術(shù)

    1 引言 線程(thread)技術(shù)早在60年代就被提出,但真正應(yīng)用多線程到操作系統(tǒng)中去,是在80年代中期,solaris是這方面的佼佼者。傳統(tǒng)的 Unix也支持線程的概念,但是在一個進程
    發(fā)表于 10-24 16:01 ?5次下載

    多線程好還是單線程好?單線程多線程的區(qū)別 優(yōu)缺點分析

    摘要:如今單線程多線程已經(jīng)得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區(qū)別又
    發(fā)表于 12-08 09:33 ?8.1w次閱讀

    mfc多線程編程實例及代碼,mfc多線程間通信介紹

    摘要:本文主要以MFC多線程為中心,分別對MFC多線程的實例、MFC多線程之間的通信展開的一系列研究,下面我們來看看原文。
    發(fā)表于 12-08 15:23 ?1.8w次閱讀
    mfc<b class='flag-5'>多線程</b>編程實例及代碼,mfc<b class='flag-5'>多線程</b>間通信介紹

    什么是多線程編程?多線程編程基礎(chǔ)知識

    摘要:多線程編程是現(xiàn)代軟件技術(shù)中很重要的一個環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進程。本文主要以多線程編程以及多線程編程相關(guān)知識而做出的一些結(jié)論。
    發(fā)表于 12-08 16:30 ?1.3w次閱讀

    SpringBoot實現(xiàn)多線程

    SpringBoot實現(xiàn)多線程
    的頭像 發(fā)表于 01-12 16:59 ?1814次閱讀
    SpringBoot實現(xiàn)<b class='flag-5'>多線程</b>

    labview AMC多線程

    labview_AMC多線程
    發(fā)表于 08-21 10:31 ?32次下載

    多線程idm下載軟件

    多線程idm下載軟件
    發(fā)表于 10-23 09:23 ?0次下載

    多線程如何保證數(shù)據(jù)的同步

    多線程編程是一種并發(fā)編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執(zhí)行不同的任務(wù),共享同一份數(shù)據(jù)。由于多線程并發(fā)執(zhí)行的特點,會引發(fā)數(shù)據(jù)同步的問題,即保證多個
    的頭像 發(fā)表于 11-17 14:22 ?1222次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應(yīng)用程序的開發(fā)。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發(fā)中非常重要,它可以實現(xiàn)程序的并發(fā)執(zhí)行,提高程序的效率和響應(yīng)速度。MFC提供了豐富的多線程支持,可以輕松地實現(xiàn)
    的頭像 發(fā)表于 12-01 14:29 ?1502次閱讀
    主站蜘蛛池模板: 金瓶梅 快播| 亚洲日韩在线天堂一| xxx免费观看| 浪潮AV色综合久久天堂| 亚洲欧洲日本天天堂在线观看 | 亚洲AV无码久久流水呻蜜桃久色| 不卡的在线AV网站| 女人一级毛片免费视频观看| 中文字幕专区高清在线观看| 久草在线精彩免费视频| 亚洲精品白色在线发布| 国产午夜a理论毛片在线影院 | 国产成人刺激视频在线观看| 欧美性视频xxxxhd| ASIAN大陆明星裸休合成PICS| 免费精品一区二区三区AA片| 最新国自产拍 高清完整版| 久久亚洲精品成人| 在线免费观看国产精品| 久久草这在线观看免费| 一本道色综合手机久久| 精品网站一区二区三区网站| 亚洲欧美一区二区三区蜜芽| 国产亚洲视频在线观看| 亚洲 自拍 欧洲 视频二区| 国产免费看片| 亚洲国产区中文在线观看| 果冻传媒妈妈要儿子| 亚洲日本香蕉视频观看视频| 好大好爽CAO死我了BL| 亚洲三级黄色| 久久国产伦子伦精品| 在线观看国产精美视频| 两个女人互添下身高潮自视频| 99er热精品视频国产免费| 欧美 亚洲综合在线一区| 被老头下药玩好爽| 色综合 亚洲 自拍 欧洲| 国产精品免费视频能看| 亚洲第一区欧美日韩精品| 婚后被调教当众高潮H喷水|