線程和多線程理論

1.線程和多線程定義

線程是程序中一個單一的順序控制流程。進程內有一個相對獨立的、可調度的執(zhí)行單元,是系統(tǒng)獨立調度和分派CPU的基本單位指令運行時的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。

2.線程和進程的區(qū)別

1.進程是資源分配的基本單位。所有與該進程有關的資源,都被記錄在進程控制塊PCB中。以表示該進程擁有這些資源或正在使用它們。
2.進程也是搶占處理機的調度單位,它擁有一個完整的虛擬地址空間。當進程發(fā)生調度時,不同的進程擁有不同的虛擬地址空間,而同一進程內的不同線程共享同一地址空間。
3.與進程相對應,線程與資源分配無關,它屬于某一個進程,并與進程內的其他線程一起共享進程的資源。
4.線程是進程中的一個單元,他是不能獨立運行的,他必須依賴某個進程。

3.使用多線程的原因

·使用線程可以把占據(jù)時間長的程序中的任務放到后臺去處理
·用戶界面的更新和交互是不能被阻塞的,耗時操作是不能放在主線程的
·當CPU是多核的時候,不同的進程可以實現(xiàn)并行,這樣就提高了程序的運行效率
·有些任務并不是連續(xù)的,需要等待,比如網(wǎng)絡收發(fā)數(shù)據(jù)、用戶輸入等, 這些操作并不需要等到執(zhí)行完成,二是需要有變化才操作。

4 多線程使用注意事項

4.1 開辟過多線程的問題

·系統(tǒng)需要為線程開辟存儲空間來管理他,線程過多,會占用大量內存。
·線程是通過CPU來調度的,過多的線程會加大CPU的負擔,會增加耗電量,還會讓機器發(fā)燙。

4.2 其他問題

·多個線程同時訪問同一數(shù)據(jù)的訪問,要確保數(shù)據(jù)的安全
·線程死鎖

5 線程的生命周期

1.線程創(chuàng)建后放到等待隊列中,等待CPU的調度,所以新建只有到就緒一種轉換。
2.就緒的是在等待的過程中,沒有被CPU執(zhí)行,不會和其他的線程爭奪資源,所以會會變成阻塞狀態(tài),只會在運行的狀態(tài)里切換。
3.運行的線程可以變成就緒、阻塞或者死亡的狀態(tài),當時間片到后,線程會進入到就緒狀態(tài),當某個線程得不到資源,會被阻塞,當線程執(zhí)行完成后,線程會死亡。
4.線程死亡后,不會保留線程相關信息,會釋放掉占用的內存,所以死亡的線程是無法逆轉的。就不可以轉成其他幾種狀態(tài)。

6 線程間的通訊

線程間的通信機制實現(xiàn)起來則相對簡單,主要包括互斥鎖、條件變量、讀寫鎖和線程信號等。
6.1 互斥鎖

互斥鎖基本原理:互斥鎖以排他的方式防止數(shù)據(jù)被并發(fā)修改。當多個線程共享相同的內存時,需要確保每個線程看到的數(shù)據(jù)是一樣的。如果是只讀,那么一定是一樣的。如果是可讀可寫,在一個線程操作一個內存區(qū)域時,包含三個步驟,即讀出數(shù)據(jù),修改數(shù)據(jù),寫回數(shù)據(jù)。如果該線程在沒有寫回數(shù)據(jù)前,另一個線程來訪問同一個區(qū)域,如果是讀,得不到最新的數(shù)據(jù)狀態(tài),如果是寫,則會造成數(shù)據(jù)覆蓋等問題。[12306購票]
互斥鎖就兩個狀態(tài):開鎖(0),上鎖(1)。將某個共享資源和互斥鎖綁定后,對該共享資源的訪問操作如下:
A】在訪問資源前,首先申請該互斥鎖,如果在開鎖狀態(tài),則申請到該鎖對象,并立即占有該鎖(鎖定)。以防其他線程訪問修改此資源。如果該鎖處于鎖定狀態(tài),默認阻塞等待。
B】原則上只有鎖定該互斥鎖的進程才能釋放此互斥鎖

6.2 條件變量

條件變量通信機制:
1、條件變量基本原理:條件變量的出現(xiàn),可以彌補互斥鎖的缺陷,有些問題僅僅靠互斥鎖無法解決。但是條件變量不能單獨使用,必須配合互斥鎖一起實現(xiàn)對資源的互斥訪問

6.3 讀寫鎖

1、讀寫鎖基本原理:在對數(shù)據(jù)的讀寫操作時,往往是讀占主要部分。為了滿足當前能夠允許多個讀出,但只允許一個寫入的需求。線程提供了讀寫鎖來實現(xiàn)。讀寫鎖基本原則如下:
A】如果有其他線程讀數(shù)據(jù),則允許其他線程執(zhí)行讀操作,但是不允許寫操作。
B】如果有其他線程申請了寫鎖,則其他線程既不能申請讀鎖,也不能申請寫鎖

6.4 線程信號:

線程是一種輕量級的進程,因此進程的信號同樣適用于線程。不過相對于進程信號,線程擁有與信號相關的私有數(shù)據(jù)——線程信號掩碼,則就決定了線程在信號操作時具有以下特性:
A】每個線程可以先別的線程發(fā)送信號,pthread_kill()函數(shù)用來完成這一操作。
B】每個線程都可以設置自己的阻塞集合。pthread_sigmask()用來完成這一操作。類似于進程中的sigprocmask()函數(shù)。主進程創(chuàng)建出來的線程繼承主進程的掩碼。
C】每個線程需要設置針對某信號的處理方式,但同一個進程中對某信號的處理方式只能有一個有效,即最后一次設置的處理方式。即在所有的線程里,同一信號在任何線程里的對該信號的處理一定相同
D】如果別的進程向當前進程發(fā)來一個信號,具體由哪個線程去處理,是未知的。

注:如果有不準確的地方,歡迎大家來吐槽。QQ:1392984568 一米陽光 (iOS 修煉者 )

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢? 今天就這個問題開始,來談談操...
    tangsl閱讀 4,309評論 0 23
  • 操作系統(tǒng)概論 操作系統(tǒng)的概念 操作系統(tǒng)是指控制和管理計算機的軟硬件資源,并合理的組織調度計算機的工作和資源的分配,...
    野狗子嗷嗷嗷閱讀 12,450評論 3 34
  • 這是十點鬼事的第三篇鬼故事! 我是黑白, 龍虎山的一名道士, 這是我第一次下山。 我本來好好在大街上軋馬路, 突然...
    素食海盜閱讀 646評論 0 1
  • 今日剽悍: 1、整理三份群聊分享精華:哲鵬在精讀主題營的收獲;媛姐分享的面對它、接受它、處理它、放下它,這12個關...
    剽悍文霞閱讀 336評論 4 1

友情鏈接更多精彩內容