標籤:c 管理 os 應用 不同的 問題
這段時間在群裡看到很多人在問一些關於隊列,同步,非同步總是,現在抽空給總結一下
現在先說兩個基本的概念,啥是進程,啥是線程,啥又是多線程;先把這兩個總是給弄清再講下面的
進程:進行中的程式,我們就叫它進程.
線程:線程就是進程中的一個獨立的執行路徑.這句話怎麼理解呢! 一個程式它是按順序從上往下執行的, 這個執行順序我們可以把它看成是一條線,把這條線就叫做線程(個人理解,錯了勿噴);每一個程式中至少包含一條線程, 這條線程,我們叫它主線程.
多線程:多線程也就是說一個程式中有多條執行路徑.在iOS當中將一些比較耗時的操作放到另一條執行路徑裡.讓它與主線程同時運行.這樣不會造成主線程的堵塞.
扯完了這些那我們來看看什麼是任務,什麼是隊列!
任務分為同步任務與非同步任務,它們的區別是:
同步任務優先順序高,線上程中有執行順序,不會開啟新的線程。
非同步任務優先順序低,線上程中執行沒有順序,看cpu閑不閑。在主隊列中不會開啟新的線程,其他隊列會開啟新的線程。
隊列:隊列我們可以把它理解為是管理工作的,它裡面放著很多的任務,來管理這些任務什麼時候在哪些線程裡面執行.隊列是先進先出的
隊列分為串列隊列和並行隊列
串列隊列:隊列中的任務按順序執行(不會同時執行)
並行隊列:隊列中的任務會並發執行,可能會有一個疑問,隊列不是先進先出嗎,如果後面的任務執行完了,怎麼出去的了。這裡需要強調下,任務執行完畢了,不一定出隊列。只有前面的任務執行完了,才會出隊列。
串列隊列開啟非同步任務,是有順序的
並行隊列裡開啟同步任務是有執行順序的,只有非同步才沒有順序
來侃侃在主隊列中開啟同步任務為什麼會阻塞線程?
在主隊列開啟同步任務,因為主隊列是串列隊列,裡面的線程是有順序的,先執行完一個線程才執行下一個線程,而主隊列始終就只有一個主線程,主線程是不會執行完畢的,因為他是無限迴圈的,除非關閉應用程式。因此在主線程開啟一個同步任務,同步任務會想搶佔執行的資源,而主線程任務一直在執行某些操作,不肯放手。兩個的優先順序都很高,最終導致死結,阻塞線程了
為啥串列隊列開啟非同步任務後嵌套同步任務造成死結?(不作死就不會死)
因為串列隊列中線程是有執行順序的,需要等上面開啟的非同步任務執行完畢,才會執行下面開啟的同步任務。而上面的非同步任務還沒執行完,要到下面的大括弧才算執行完畢,而下面的同步任務已經在搶佔資源了,就會發生死結。
串列隊列中開啟同步任務後嵌套同步任務造成死結(再套幾下,就不知道怎麼死的了)?
因為串列隊列中線程是有執行順序的,需要等上面開啟的同步任務執行完畢,才會執行下面開啟的同步任務。而上面的同步任務還沒執行完,要到下面的大括弧才算執行完畢,而下面的同步任務已經在搶佔資源了,就會發生死結
串列隊列開啟同步任務後嵌套非同步任務就不會造成死結,開啟非同步,就會開啟一個新的線程,不會阻塞線程
主線程隊列和GCD建立的隊列也是有區別?
主線程隊列和GCD建立的隊列是不同的。在GCD中建立的隊列優先順序沒有主隊列高,所以在GCD中的串列隊列開啟同步任務裡面沒有嵌套任務是不會阻塞主線程,只有一種可能導致死結,就是串列隊列裡,嵌套開啟任務,有可能會導致死結。
主線程隊列中不能開啟同步,會阻塞主線程。只能開啟非同步任務,開啟非同步任務也不會開啟新的線程,只是降低非同步任務的優先順序,讓cpu閒置時候才去調用。而同步任務,會搶佔主線程的資源,會造成死結。