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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么說線程是輕量級的概念呢?守護線程是指什么?

冬至配餃子 ? 來源:多蘭多 ? 作者:Toranto ? 2022-08-19 10:39 ? 次閱讀

線程-Thread

進程是計算機中最小的資源分配單位,創建一個進程,操作系統需要向其分配一定的內存資源。所以進程對于操作系統來說還是有一定的負擔。

線程是計算機中被CPU調度的最小單位,進程中的代碼是由線程來完成的,每個進程可以有多個線程,但是至少要有一個線程。

poYBAGL-9e6AbR-PAABgWuObfCs448.png

線程是一個輕量級概念,它沒有屬于自己的資源。同一個進程中的所有的線程的資源是共享的。在Python中,一個進程中的多個線程無法并行,只能并發執行(Java,C++, C#C語言中是可以的),主要是因為Python屬于解釋型語言,而Java,C語言屬于編譯型語言,Python中有獨有的GIL(Global Interpreter Lock)全局解釋器鎖。

編譯型語言:程序在執行之前需要一個專門的編譯過程,把程序編譯成 為機器語言的文件,運行時不需要重新翻譯,直接使用編譯的結果就行了。而相對的,解釋性語言編寫的程序不進行預先編譯,以文本方式存儲程序代碼。在發布程序時,看起來省了道編譯工序。但是,在運行程序的時候,解釋性語言必須先解釋再運行。

線程和進程之間的區別主要在于:

占用的資源

調度的效率

資源是否共享

創建線程與創建進程的操作幾乎相同:

pYYBAGL-9gKARJgJAABIMAUAN68733.png

為什么說線程是輕量級的概念呢?

poYBAGL-9iiAWB3OAAD6DyC2Fws210.pngpYYBAGL-9i6AExw_AAAaVw31UnA289.png

poYBAGL-9jSAEc6WAACvbpHmY30646.png

結果顯而易見的。

守護線程-setDaemon

守護線程是指在程序運行的時候在后臺提供一種通用服務的線程。

守護線程的特性在進程中已經有過闡述,守護線程和守護進程其實差不多,但還是有些許差別:

pYYBAGL-9liAEtjtAACZqwqIfM8039.png
poYBAGL-9l2AJ_P9AAEL_XMnQEs674.png

從結果可以看出,守護線程并沒有像進程一樣,在主進程的代碼結束之后便結束,反而等全部線程執行完畢之后再結束。因為在同一個進程中,多個線程的資源是共享的,因此守護線程的守護對象應該是全部線程而不是進程(進程的代碼也要靠線程來執行)

當同時滿足以下兩個條件時,就會出現線程的安全問題①多個線程在操作共享的數據;②操作共享數據的線程代碼有多條。

舉例:

poYBAGL-9pWARoH8AADC8qOIQm0381.png

從一百到十萬結果基本上都是0,但是當循環次數擴大到100萬的時候,問題就開始顯現了:

pYYBAGL-9qqAK9btAACECgNbUeg416.png

和進程修改共享數據的原理是一樣的,多個線程多個代碼對同一個共享數據進行修改,次數足夠大時難免會出現同時操作的現象,自然而然就會產生數據的誤差的問題。所以可以引入線程鎖Lock的概念方法,進程鎖Lock的原理為同一時刻只允許一個進程對數據進行修改,線程鎖Lock的原理就是同一時刻只允許一個線程對數據進行修改。

poYBAGL-9tOAMKJuAADhflZ64zI074.pngpYYBAGL-9tmAb5xUAAAugfDMaA8606.pngpoYBAGL-9t6AbSU4AAC4B03wYso423.png

這樣就保護了數據安全,但是時間相對來說就長了很多很多

遞歸鎖-RLock

遞歸鎖的講解需要引入“哲學家吃面問題”


poYBAGL-9viAX70ZAACpDeTiA1M018.png

所謂哲學家吃面問題就是每個哲學家必須要搶到叉子和面條才能夠繼續使程序繼續進程,否則程序就會陷入死鎖狀態。也就是有兩把鎖,線程需要同時拿到兩把才能夠程序繼續運行,否則一把鎖被一個線程拿到,另一把鎖被另一個線程拿到,這樣兩把鎖就無法同時解鎖,就進入死鎖狀態。

寫一個死鎖程序:

pYYBAGL-9yGAGzVCAAGI8nklWz4996.pngpoYBAGL-9yaAPJnuAABbjpV7BcQ034.pngpoYBAGL-9yuAFTlPAAD9XHPn8Rk162.png

當eat1激活了noodle_lock之后,eat2的noodle_lock必須等到ea1釋放才能激活。而eat1代碼順序為先面條后叉子,eat2代碼順序為先叉子后面條,所以在相同反應的情況下,哲學家2搶到面條的同時,哲學家3搶到了叉子,兩個人同時搶到更靠近自己的東西,誰也不放手,表現為程序無法進行下去,也就是死鎖現象。(為什么要用eat1和eat2兩個方法,而不是只用eat1一個方法?是因為需要有一個偏向值,eat1更偏向面條,所以哲學家1和2更容易搶到面條,eat2更偏向叉子,所以哲學家3和4更容易搶到叉子。如果只用一個eat,那么表現為哲學家們按順序吃面條(同步))

而且解鎖的順序也頗為講究,采用后進先出法,具體表現為以下的圖,第一道門開了鎖進去,再開第二道鎖再進去,那么出來的時候需要鎖門,鎖門就要先鎖里面的門,不然都出來了還怎么鎖里面的門呢?

pYYBAGL-9z2ABTFVAAA6yqcn7IM453.png

為了解決死鎖現象,threading模塊中還提供了RLock遞歸鎖的方法,

poYBAGL-92WAHgiNAAF8jn9_U2Q744.pngpYYBAGL-92uAINWZAACMOrYbLN8859.pngpYYBAGL-93CAf3xAAADrsjiSmws218.png

當多個線程同時搶多把鎖的時候就會出現死鎖的現象。其實遞歸鎖也不是一個很好地解決方案,死鎖現象的發生不是互斥鎖的原因,而是程序猿/媛的邏輯出現了問題。



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10901

    瀏覽量

    212640
  • 計算機
    +關注

    關注

    19

    文章

    7532

    瀏覽量

    88432
  • 操作系統
    +關注

    關注

    37

    文章

    6882

    瀏覽量

    123581
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137407
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19722
收藏 人收藏

    評論

    相關推薦

    Linux多線程編程基礎知識解析

    線程輕量級的進程(`LWP: Light Weight Process`),在`Linux`環境下線程的本質仍是`進程`,進程是資源分配的`最小單位`,線程是操作系統調度執行的`最小
    發表于 07-14 16:41 ?839次閱讀
    Linux多<b class='flag-5'>線程</b>編程基礎知識解析

    什么是守護線程守護線程的底層原理和使用示例

    大家好,今天這篇文章來梳理一下有關守護線程的相關問題,這也是之前曾經有被問到過的面試題,在此之前我們先看一看守護線程的使用示例。
    的頭像 發表于 01-05 11:01 ?1469次閱讀
    什么是<b class='flag-5'>守護</b><b class='flag-5'>線程</b>?<b class='flag-5'>守護</b><b class='flag-5'>線程</b>的底層原理和使用示例

    Java守護線程和本地線程的區別

    java中的線程分為兩種:守護線程(Daemon)和用戶線程(User)。
    發表于 08-07 08:10

    嵌入式Linux多任務編程、進程、線程分別是什么意思

    ,它是系統進行資源分配和調度的基本單元*//*線程:線程是進程內獨立的一條運行路線,也可以稱為輕量級進程。線程可以對進程的內存空間和資源進行訪問,一個進程可以擁有多個
    發表于 12-22 07:43

    多核架構及多線程編程

    線程(thread)是進程上下文(context)中執行的代碼序列,又被稱為輕量級進程(light weight process)? 在支持多線程的系統中,進程成為資源分配和保護的實體,而線程
    發表于 09-11 16:12 ?10次下載
    多核架構及多<b class='flag-5'>線程</b>編程

    解決線程安全問題技巧匯總

    線程,有時被稱為輕量級進程,是程序執行流的最小單元。一個標準的線程線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中
    發表于 12-01 13:42 ?1588次閱讀

    什么是線程

    線程輕量級進程;使用線程節省了 CPU 周期的浪費,同時提高了應用程序的效率
    的頭像 發表于 01-20 15:17 ?2019次閱讀
    什么是<b class='flag-5'>線程</b>

    什么是多線程

    被定義為程序的執行路徑,也叫執行單元 線程輕量級進程;使用線程節省了 CPU 周期的浪費,同時提高了應用程序的效率 進程 是Windows系統中的一個基本概念,它包含著一個運行
    的頭像 發表于 02-28 09:56 ?1310次閱讀
    什么是多<b class='flag-5'>線程</b>

    詳解Linux線程線程與異步編程、協程與異步

    協程不是系統級線程,很多時候協程被稱為“輕量級線程”、“微線程”、“纖程(fiber)”等。簡單來說可以認為協程是線程里不同的函數,這些函數
    的頭像 發表于 03-16 15:49 ?1021次閱讀

    進程和線程的區別

    每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),
    的頭像 發表于 05-09 11:06 ?6060次閱讀
    進程和<b class='flag-5'>線程</b>的區別

    什么是虛擬線程?虛擬線程到底是做什么用的

    虛擬線程是在Java并發領域添加的一個新概念,那么虛擬線程到底是做什么用的
    的頭像 發表于 10-29 10:23 ?3187次閱讀
    什么是虛擬<b class='flag-5'>線程</b>?虛擬<b class='flag-5'>線程</b>到底是做什么用的<b class='flag-5'>呢</b>?

    線程池基本概念與原理

    一、線程池基本概念與原理 1.1 線程概念及優勢 C++線程池簡介 線程池是一種并發編程技術,
    的頭像 發表于 11-10 10:24 ?568次閱讀

    線程池的基本概念

    線程池的基本概念 不管線程池是什么東西!但是我們必須知道線程池被搞出來的目的就是:提高程序執行效率而設計出來的; 了解了線程池的目的后:我們
    的頭像 發表于 11-10 16:37 ?553次閱讀
    <b class='flag-5'>線程</b>池的基本<b class='flag-5'>概念</b>

    如何查看一個線程的ID

    1.什么是線程? linux內核中是沒有線程這個概念的,而是輕量級進程的概念:LWP。一般我們所說的線程
    的頭像 發表于 11-13 14:38 ?1444次閱讀
    如何查看一個<b class='flag-5'>線程</b>的ID

    mcu線程和進程的區別是什么

    是程序執行的基本單位,它是進程中的一個實體,是進程內的一條執行路徑。線程是CPU調度的最小單位,它可以看作是輕量級的進程,不擁有獨立的地址空間。線程共享進程的資源(如堆、文件描述符等),同一進程內的多個
    的頭像 發表于 01-04 10:45 ?821次閱讀
    主站蜘蛛池模板: 交换邻居波多野结衣中文字幕| 国产亚洲精品久久久久5区| 俄罗斯粗大猛烈18P| 男人被绑着强行摸j| 真实的强视频免费网站 | 在线天天看片视频免费观看| 国产午夜精品一区二区三区| 性按摩AAAAAAA片| 国产精品一区二区三区免费| 小黄飞二人转| 国产精品视频一区二区猎奇| 玩两个少妇女邻居| 国产人妻人伦精品久久久| 性欧美videofree中文字幕| 国产婷婷一区二区在线观看| 性盈盈剧场| 精品国产三级a| 专干老肥熟女视频网站300部| 蜜臀亚洲AV永久无码精品老司机| 91麻豆久久| 人人干人人爽| 国产精品亚洲专区在线播放| 亚洲欧美成人在线| 久久亚洲网站| 99久在线国内在线播放免费观看| 欧美精品亚洲精品日韩专区一| XXX老姥群交| 日日干日日操日日射| 国产电影一区二区三区| 亚洲精品天堂自在久久77| 久久亚洲精品2017| 把极品白丝班长啪到腿软| 无码国产精品高潮久久9| 久久99国产亚洲高清观着| 99RE久久精品国产| 色欲精品国产AV久久久| 精品国产麻豆免费人成网站| 最近更新2019中文字幕国语| 日日噜噜大屁股熟妇| 黄色aa大片| YELLOW视频在线观看最新 |