iOS線程鎖的研究
在開始說線程鎖之前,我們需要了解線程的概念。
什么是線程
線程,有時被稱為輕量級進程(LWP),是程序執(zhí)行流的最小單元。一個標準的線程由線程ID,當前指令指針,寄存器集合和堆棧組成。
大多數(shù)的軟件應(yīng)用中,線程的數(shù)量都不止一個。多個線程可以互不干擾地并發(fā)執(zhí)行,并共享的全局變量和堆的數(shù)據(jù)。
那什么情況下,我們會用多線程:
1.某個操作可能會陷入長時間等待,等待的線程會進入睡眠狀態(tài),無法繼續(xù)執(zhí)行,多線程執(zhí)行可以有效利用等待的時間。典型的例子是等待網(wǎng)絡(luò)響應(yīng)。
2.某個操作(類似有算法的方法)會消耗大量的時間,如果只有一個線程,程序和用戶之間的交互會中斷,多線程可以讓主線程負責交互,另一個線程負責計算。
3.程序本身邏輯就要并發(fā),例如下載程序
4.多核計算機,本身具有同時具有多個線程的能力(充分利用硬件優(yōu)勢)
5.多線程主數(shù)據(jù)共享方面效率要高很多
線程調(diào)度與優(yōu)先級
線程調(diào)度
在多道程序系統(tǒng)中,進程的數(shù)量往往多于處理器的個數(shù),進程爭用處理器的情況在所難免。處理器調(diào)度是對處理器進行分配,就是從就緒隊列中,按照一定的算法,選擇一個進程并將處理器分配給他運行,以實現(xiàn)進程的并發(fā)執(zhí)行。
線程的調(diào)度準則主要如下:
CPU利用率
系統(tǒng)吞吐量
周轉(zhuǎn)時間
等待時間
響應(yīng)時間
線程正常的調(diào)度過程,詳情如下:

線程通常的三種狀態(tài):
運行:此線程正在執(zhí)行
就緒:此線程可以立刻運行,但CPU已經(jīng)被占用
等待:此線程正在等待某一事件
除了正常的線程調(diào)度之外,現(xiàn)在普遍的操作系統(tǒng)還帶有優(yōu)先級調(diào)度,即優(yōu)先級高的限制性,具體的內(nèi)部實現(xiàn)詳見線程的調(diào)度,這里需要說明一下,線程優(yōu)先級的改變主要有三種方式:
1.用戶制定優(yōu)先級
2.根據(jù)進入優(yōu)先級的頻繁程度提升或降低優(yōu)先級
3.長時間得不到調(diào)用而被提升優(yōu)先級
伴隨多線程的出現(xiàn),不同的線程訪問同一資源,在保證資源的正確性的前提下,線程鎖的概念就運應(yīng)而生。
鎖
線程的同步的實現(xiàn)原理本質(zhì)即為鎖的現(xiàn)實,在介紹iOS中的同步鎖之前,我們首先需要介紹鎖的類型。
鎖的類型
二元信號量(Binary Semaphore)
二元信號量是最簡單的一種鎖,它只有兩種狀態(tài):占用與非占用。它適合只能被唯一一個線程獨占訪問的資源。當二元信號量處于非占用狀態(tài)時,第一個試圖獲取該二元信號量的線程會獲得該鎖,并將二元信號量置為占用狀態(tài)。第二個試圖獲取該二元信號量的線程將會等待,直到該鎖的釋放。
互斥量(Mutex)
互斥量與信號量非常類似,區(qū)別就在于信號量可以被任意的線程獲取并釋放,互斥量則要求哪個線程獲取了互斥量,哪個線程就要負責釋放。
臨界區(qū)(Critical Section)
與互斥鎖類似,但比互斥鎖更為嚴格,臨界區(qū)的作用范圍僅限于本進程,其余線程不可獲取該鎖。
讀寫鎖(Read-Write Lock)
這里不詳細介紹,讀寫鎖三種狀態(tài):自由/共享/獨占有兩種獲取方式:共享和獨占
當以共享方式去獲取鎖時,除了獨占狀態(tài)需等待,其余狀態(tài)均可獲??;
當以獨占方式去獲取鎖時,線程必須等待鎖被所有資源釋放后,才可以獲?。?/p>
條件變量(Condition Variable)
該鎖類似一個塞子,不同的線程均可以等待相同的條件,但只有滿足條件的線程才會被喚醒。
iOS中存在的同步鎖
(未完待續(xù))