1. 程式人生 > >夫唯不爭,故天下莫能與之爭

夫唯不爭,故天下莫能與之爭

概述

程序是資源分配的基本單位,程序由執行緒組成。

執行緒是系統執行排程的基本單位,執行緒隸屬於程序。

為何引入執行緒

1、程序在同一時間只能幹一件事,比如我們在上課的時候,往往要耳朵聽課,手記筆記,腦子思考,如果套用程序的機制,那麼我們聽課的時候也不能記錄筆記,更不能思考。

2、當程序某個操作阻塞時,整個程序就會掛起,也就是說當老師講課時需要思考的時候,我們也還只能聽課,不能思考也不能記錄筆記

執行緒與程序的區別

1、程序是資源分配的基本單位,執行緒是系統執行排程的基本單位

2、每個程序都有獨立的記憶體地址空間,互不影響,每個執行緒都共享同一程序的記憶體空間

3、當一個程序崩潰時,由於地址空間是獨立的,所以不會影響其他程序,當一條執行緒出現問題時,整個程序就會有問題

4、執行緒可以看做是程序內部的執行路徑,當路徑只有一條的時候,就稱為單執行緒,多條則為多執行緒

5、建立執行緒要比建立程序快,在建立和回收程序的時候,系統都要為之分配和回收資源,導致系統的開銷明顯大於執行緒的開銷


程序間通訊

管道及有名管道:

管道用於具有親緣關係的父子程序之間的通訊;有名管道除了具有管道的功能,還允許無緣程序之間的通訊

訊號:

在軟體層次上對中斷機制的一種模擬,用於通知程序有某件事要發生

訊息佇列:

訊息的連結表,具有寫許可權的程序可以向訊息佇列中寫入訊息,具有讀許可權的程序可以從訊息佇列中讀取訊息。

共享記憶體:

多個程序訪問同一塊記憶體區域,不同程序之間可以看到對方對資料的更新

Socket:

網路中不同機器之間的網路通訊


執行緒間通訊

訊號量(允許多個執行緒在同一時間訪問統一資源):

我們可以看個例子:假設車是執行緒,停車場是記憶體空間。有一個停車場內只能容納5個車,所以每進去一輛車就在門衛處拿一個牌號,因為只有5個牌號,所以當停車場停夠5輛車的時候,其餘車就不能進入,只能在外面排隊等待。只有當停車場內一個車出來的時候,把車牌歸還給門衛,此時在外面排隊的進去一個車。這樣做保證了多個執行緒之間不衝突。

互斥:

把停車場的例子換成停車場內只能容納一個車。我停時,你就不能停。

臨界區:

任何時刻只允許一個執行緒對共享資源進行操作,其他執行緒要訪問共享資源都會被掛起,當臨界區中的執行緒離開時,其他執行緒可以搶佔

執行緒間通訊的目的主要是用於執行緒同步,所以沒有像程序中交換資料的通訊機制


多執行緒同步和互斥的區別

同步就是執行緒之間的一種制約關係,一個執行緒的執行依賴於另一個執行緒的訊息,一個執行緒只有得到另一個執行緒的訊息時可以被喚醒,否則應該等待。

互斥是當一個執行緒訪問共享資源的時候,任何時刻只允許一個執行緒去使用,其他要使用該資源的執行緒必須等待,只要佔用該資源的執行緒釋放該資源。

因此互斥可以看做一種特殊的同步。

舉個例子:

一個全域性變數,只要當主執行緒修改了這個變數後,下一個才可以訪問,此時就需要同步兩個執行緒;

一個執行緒在訪問全域性變數的時候另一個執行緒不能訪問這個變數,這就是互斥。


執行緒安全

多執行緒的程式是可預期的,和單執行緒執行結果一樣,那麼就說明是安全的


參考