iOS線程安全--鎖

iOS線程安全--鎖

參考資料:https://developer.aliyun.com/article/1218542?spm=a2c6h.14164896.0.0.70f71fdaogd7rx

NSLock
synchronized閉包
這種鎖是比較常用的,因?yàn)槠涫褂梅椒ㄊ撬墟i中最簡單的,但性能卻是最差的,所以對性能要求不太高的使用情景下synchronized不失為一種比較方便的鎖。代碼如下。
NSRecursiveLock
NSRecursiveLock定義了一個(gè)鎖,該鎖可以被同一個(gè)線程多次獲取而不會(huì)導(dǎo)致死鎖,死鎖是一種線程永久阻塞等待自己放棄鎖的情況。當(dāng)鎖定線程有一個(gè)或多個(gè)鎖時(shí),所有其他線程都被阻止訪問受該鎖保護(hù)的代碼。

OSSpinLock
自旋鎖:由于一直處于while循環(huán),所以對CPU的占用也是比較高的,用CPU的消耗換來的好處就是自旋鎖的性能很高。系統(tǒng)維護(hù)了 5 個(gè)不同的線程優(yōu)先級/QoS: background,utility,default,user-initiated,user-interactive。高優(yōu)先級線程始終會(huì)在低優(yōu)先級線程前執(zhí)行,一個(gè)線程不會(huì)受到比它更低優(yōu)先級線程的干擾。這種線程調(diào)度算法會(huì)產(chǎn)生潛在的優(yōu)先級反轉(zhuǎn)問題,從而破壞了 spin lock。

具體來說,如果一個(gè)低優(yōu)先級的線程獲得鎖并訪問共享資源,這時(shí)一個(gè)高優(yōu)先級的線程也嘗試獲得這個(gè)鎖,它會(huì)處于 spin lock 的忙等狀態(tài)從而占用大量 CPU。此時(shí)低優(yōu)先級線程無法與高優(yōu)先級線程爭奪 CPU 時(shí)間,從而導(dǎo)致任務(wù)遲遲完不成、無法釋放 lock。這并不只是理論上的問題,libobjc 已經(jīng)遇到了很多次這個(gè)問題了,于是蘋果的工程師停用了 OSSpinLock。

優(yōu)先級高的持續(xù)占有cpu,直到獲取到資源。低優(yōu)先級的競爭不過cpu,但是拿著資源,無法使用。導(dǎo)致死鎖。

dispatch_semaphore
在iOS開發(fā)中,信號量就是通過GCD來實(shí)現(xiàn)的,而GCD是對C語言的一個(gè)封裝,不同的開發(fā)語言中對于信號量semaphore都有自己的實(shí)現(xiàn),所以本節(jié)不僅是代表了pthread,也是信號量的使用,更是跨線程訪問的一個(gè)主要的知識點(diǎn)。
信號量的使用其實(shí)很簡單,與其他開發(fā)語言中使用的信號量類似,通過對信號的等待和釋放來使用,信號量屬于生產(chǎn)者消費(fèi)者模式,這種模式可以用在多個(gè)使用場景中,下面只是比較常見的一種。
dispatch_semaphore_create(1)
dispatch_semaphore_wait()
dispatch_semaphore_signal()
NSConditionLock與NSCondition
狀態(tài)鎖是一種比較常用的鎖,在多線程操作中,用戶可以指定某線程去執(zhí)行操作,只需要設(shè)定對應(yīng)的狀態(tài)即可。
pthread
pthread的全稱是POSIX thread,是一套跨平臺的多線程API,各個(gè)平臺對其都有實(shí)現(xiàn)。pthread是一套非常強(qiáng)大的多線程鎖,可以創(chuàng)建互斥鎖(普通鎖)、遞歸鎖、信號量、條件鎖、讀寫鎖、once鎖等,基本上所有涉及的鎖,都可以用pthread來實(shí)現(xiàn),下面分別對其進(jìn)行舉例。
1.互斥鎖(普通鎖)
pthread_mutex_unlock
pthread_mutex_lock
2.遞歸鎖
遞歸鎖的創(chuàng)建方法跟普通鎖是同一個(gè)方法,不過需要傳遞一個(gè)attr參數(shù)。
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
3.pthread信號量
pthread的信號量不同于GCD自帶的信號量,如前面所說,pthread是跨平臺多線程處理的API,對信號量處理也提供了相應(yīng)的使用。其大概原理和使用方法與GCD提供的信號量機(jī)制類似,使用起來也比較方便。關(guān)于GCD的信號量在下面會(huì)單獨(dú)講到,這里是pthread信號量的使用代碼。
4.讀寫鎖
讀寫鎖是一種特殊的自旋鎖,將對資源的訪問者分為讀者和寫者,顧名思義,讀者對資源只進(jìn)行讀訪問,而寫者對資源只有寫訪問。相對于自旋鎖來說,這種鎖能提高并發(fā)性。在多核處理器操作系統(tǒng)中,允許多個(gè)讀者訪問同一資源,卻只能有一個(gè)寫者執(zhí)行寫操作,并且讀寫操作不能同時(shí)執(zhí)行。
pthread_rwlock_rdlock
pthread_rwlock_unlock
5.信號量。。。。。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容