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

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