計(jì)算機(jī)教學(xué)課件:04-多線程_第1頁
計(jì)算機(jī)教學(xué)課件:04-多線程_第2頁
計(jì)算機(jī)教學(xué)課件:04-多線程_第3頁
計(jì)算機(jī)教學(xué)課件:04-多線程_第4頁
計(jì)算機(jī)教學(xué)課件:04-多線程_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、多線程面試題你理解的多線程?iOS的多線程方案有哪幾種?你更傾向于哪一種?你在項(xiàng)目中用過 GCD 嗎?GCD 的隊(duì)列類型說一下 OperationQueue 和 GCD 的區(qū)別,以及各自的優(yōu)勢線程安全的處理手段有哪些?OC你了解的鎖有哪些?在你回答基礎(chǔ)上進(jìn)行二次提問;追問一:自旋和互斥對比?追問二:使用以上鎖需要注意哪些?追問三:用C/OC/C+,任選其一,實(shí)現(xiàn)自旋或互斥?口述即可!面試題請問下面代碼的打印結(jié)果是什么?打印結(jié)果是:1、3原因performSelector:withObject:afterDelay:的本質(zhì)是往Runloop中添加定時(shí)器子線程默認(rèn)沒有啟動(dòng)Runloop面試題請問下

2、面代碼的打印結(jié)果是什么?iOS中的常見多線程方案技術(shù)方案簡介語言線程生命周期使用頻率pthreadNSThreadGCDNSOperation使用更加面向?qū)ο蠛唵我子茫芍苯硬僮骶€程對象一套通用的多線程API適用于UnixLinuxWindows等系統(tǒng)跨平臺(tái)可移植使用難度大旨在替代NSThread等線程技術(shù)充分利用設(shè)備的多核基于GCD(底層是GCD)比GCD多了一些更簡單實(shí)用的功能使用更加面向?qū)ο驝COCOC自動(dòng)管理自動(dòng)管理程序員管理程序員管理幾乎不用偶爾使用經(jīng)常使用經(jīng)常使用GCD的常用函數(shù)GCD中有2個(gè)用來執(zhí)行任務(wù)的函數(shù)用同步的方式執(zhí)行任務(wù)dispatch_sync(dispatch_que

3、ue_t queue, dispatch_block_t block);queue:隊(duì)列block:任務(wù)用異步的方式執(zhí)行任務(wù)dispatch_async(dispatch_queue_t queue, dispatch_block_t block);GCD源碼:/apple/swift-corelibs-libdispatchGCD的隊(duì)列GCD的隊(duì)列可以分為2大類型并發(fā)隊(duì)列(Concurrent Dispatch Queue)可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù))并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效串行隊(duì)列(Serial Dispatch Qu

4、eue)讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))容易混淆的術(shù)語有4個(gè)術(shù)語比較容易混淆:同步、異步、并發(fā)、串行同步和異步主要影響:能不能開啟新的線程同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力異步:在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力并發(fā)和串行主要影響:任務(wù)的執(zhí)行方式并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行串行:一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)各種隊(duì)列的執(zhí)行效果使用sync函數(shù)往當(dāng)前串行隊(duì)列中添加任務(wù),會(huì)卡住當(dāng)前的串行隊(duì)列(產(chǎn)生死鎖)沒有開啟新線程串行執(zhí)行任務(wù)沒有開啟新線程串行執(zhí)行任務(wù)沒有開啟新線程串行執(zhí)行任務(wù)有開啟新線程并發(fā)執(zhí)行任務(wù)有開啟新線程串行執(zhí)行任務(wù)沒有開啟

5、新線程串行執(zhí)行任務(wù)并發(fā)隊(duì)列手動(dòng)創(chuàng)建的串行隊(duì)列主隊(duì)列同步(sync)異步(async)主線程主隊(duì)列任務(wù)1sync任務(wù)3任務(wù)2viewDidLoad子線程串行隊(duì)列block0block1串行隊(duì)列子線程并發(fā)隊(duì)列block0block1隊(duì)列組的使用思考:如何用gcd實(shí)現(xiàn)以下功能異步并發(fā)執(zhí)行任務(wù)1、任務(wù)2等任務(wù)1、任務(wù)2都執(zhí)行完畢后,再回到主線程執(zhí)行任務(wù)3多線程的安全隱患資源共享1塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問同一塊資源比如多個(gè)線程訪問同一個(gè)對象、同一個(gè)變量、同一個(gè)文件當(dāng)多個(gè)線程訪問同一塊資源時(shí),很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題多線程安全隱患示例01 存錢取錢余額1000時(shí)間線程存

6、錢線程取錢100010001000+100020001000-500500多線程安全隱患示例02 賣票票數(shù)1000時(shí)間線程賣票線程賣票100010001000 - 19991000 - 1999多線程安全隱患分析多線程安全隱患的解決方案解決方案:使用線程同步技術(shù)(同步,就是協(xié)同步調(diào),按預(yù)定的先后次序進(jìn)行)常見的線程同步技術(shù)是:加鎖iOS中的線程同步方案OSSpinLockos_unfair_lockpthread_mutexdispatch_semaphoredispatch_queue(DISPATCH_QUEUE_SERIAL)NSLockNSRecursiveLockNSConditio

7、nNSConditionLocksynchronizedGNUstepGNUstep是GNU計(jì)劃的項(xiàng)目之一,它將Cocoa的OC庫重新開源實(shí)現(xiàn)了一遍源碼地址:/resources/downloads.php雖然GNUstep不是蘋果官方源碼,但還是具有一定的參考價(jià)值OSSpinLockOSSpinLock叫做”自旋鎖”,等待鎖的線程會(huì)處于忙等(busy-wait)狀態(tài),一直占用著CPU資源目前已經(jīng)不再安全,可能會(huì)出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)問題如果等待鎖的線程優(yōu)先級(jí)較高,它會(huì)一直占用著CPU資源,優(yōu)先級(jí)低的線程就無法釋放鎖需要導(dǎo)入頭文件#import os_unfair_lockos_unfair_lock

8、用于取代不安全的OSSpinLock ,從iOS10開始才支持從底層調(diào)用看,等待os_unfair_lock鎖的線程會(huì)處于休眠狀態(tài),并非忙等需要導(dǎo)入頭文件#import pthread_mutexmutex叫做”互斥鎖”,等待鎖的線程會(huì)處于休眠狀態(tài)需要導(dǎo)入頭文件#import pthread_mutex 遞歸鎖pthread_mutex 條件NSLock、NSRecursiveLockNSLock是對mutex普通鎖的封裝NSRecursiveLock也是對mutex遞歸鎖的封裝,API跟NSLock基本一致NSConditionNSCondition是對mutex和cond的封裝NSCond

9、itionLockNSConditionLock是對NSCondition的進(jìn)一步封裝,可以設(shè)置具體的條件值dispatch_semaphoresemaphore叫做”信號(hào)量”信號(hào)量的初始值,可以用來控制線程并發(fā)訪問的最大數(shù)量信號(hào)量的初始值為1,代表同時(shí)只允許1條線程訪問資源,保證線程同步dispatch_queue直接使用GCD的串行隊(duì)列,也是可以實(shí)現(xiàn)線程同步的synchronizedsynchronized是對mutex遞歸鎖的封裝源碼查看:objc4中的objc-sync.mm文件synchronized(obj)內(nèi)部會(huì)生成obj對應(yīng)的遞歸鎖,然后進(jìn)行加鎖、解鎖操作iOS線程同步方案性能

10、比較性能從高到低排序os_unfair_lockOSSpinLockdispatch_semaphorepthread_mutexdispatch_queue(DISPATCH_QUEUE_SERIAL)NSLockNSConditionpthread_mutex(recursive)NSRecursiveLockNSConditionLocksynchronized自旋鎖、互斥鎖比較什么情況使用自旋鎖比較劃算?預(yù)計(jì)線程等待鎖的時(shí)間很短加鎖的代碼(臨界區(qū))經(jīng)常被調(diào)用,但競爭情況很少發(fā)生CPU資源不緊張多核處理器什么情況使用互斥鎖比較劃算?預(yù)計(jì)線程等待鎖的時(shí)間較長單核處理器臨界區(qū)有IO操作臨界區(qū)代碼復(fù)雜或者循環(huán)量大臨界區(qū)競爭非常激烈atomicatomic用于保證屬性setter、getter的原子性操作,相當(dāng)于在getter和setter內(nèi)部加了線程同步的鎖可以參考源碼objc4的objc-accessors.mm它并不能保證使用屬性的過程是線程安全的iOS中的讀寫安全方案思考如何實(shí)現(xiàn)以下場景同一時(shí)間,只能有1個(gè)線程進(jìn)行寫的操作同一時(shí)間,允許有多個(gè)線程進(jìn)行讀的操作同一時(shí)間,不允許既有寫的操作,又有讀的操作上面的場景就是典型的“多讀單寫”,經(jīng)常用于文件等數(shù)據(jù)的讀寫操作,iOS中的實(shí)現(xiàn)方案有pthread_rwlock:讀寫鎖dispatc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論