25.3:GCD的隊列可以分為2大類型
并發(fā)隊列(Concurrent Dispatch Queue)
可以讓多個任務并發(fā)(同時)執(zhí)行(自動開啟多個線程同時執(zhí)行任務)
并發(fā)功能只有在異步(dispatch_async)函數下才有效
串行隊列(Serial Dispatch Queue)
讓任務一個接著一個地執(zhí)行(一個任務執(zhí)行完畢后肉津,再執(zhí)行下一個任務)
25.4: 有4個術語比較容易混淆:同步铆农、異步空民、并發(fā)、串行
同步和異步主要影響:能不能開啟新的線程
同步:在當前線程中執(zhí)行任務借浊,不具備開啟新線程的能力
異步:在新的線程中執(zhí)行任務,具備開啟新線程的能力
并發(fā)和串行主要影響:任務的執(zhí)行方式
并發(fā):多個任務并發(fā)(同時)執(zhí)行
串行:一個任務執(zhí)行完畢后萝招,再執(zhí)行下一個任務
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?并發(fā)隊列? ? ? ? ? ? ? 手動創(chuàng)建的串行隊列? ? ? ? ? ? ? 主隊列
? ? ? ? ? ? ? ? ? ? ? ? ? ?沒有開啟新線程? ? ? ? ? ?沒有開啟新線程? ? ? ? ? ? ? 沒有開啟新線程
同步(sync)? ? ? 串行執(zhí)行任務? ? ? ? ? ? ? 串行執(zhí)行任務? ? ? ? ? ? ? ? 串行執(zhí)行任務
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 有開啟新線程? ? ? ? ? ? ? 有開啟新線程? ? ? ? ? ? ? ? 沒有開啟新線程
異步(async)? ? 并發(fā)執(zhí)行任務? ? ? ? ? ? ? ?串行執(zhí)行任務? ? ? ? ? ? ? ? 串行執(zhí)行任務
*使用sync函數往當前串行隊列中添加任務蚂斤,會卡住當前的串行隊列(產生死鎖)
25.4.1: 多線程的安全隱患
資源共享
1塊資源可能會被多個線程共享,也就是多個線程可能會訪問同一塊資源
比如多個線程訪問同一個對象槐沼、同一個變量曙蒸、同一個文件
當多個線程訪問同一塊資源時捌治,很容易引發(fā)數據錯亂和數據安全問題
25.5:OSSpinLock叫做”自旋鎖”,等待鎖的線程會處于忙等(busy-wait)狀態(tài)纽窟,一直占用著CPU資源
目前已經不再安全具滴,可能會出現優(yōu)先級反轉問題
如果等待鎖的線程優(yōu)先級較高,它會一直占用著CPU資源师倔,優(yōu)先級低的線程就無法釋放鎖
需要導入頭文件#import <libkern/OSAtomic.h>
25.3.1:mutex叫做”互斥鎖”构韵,等待鎖的線程會處于休眠狀態(tài)
需要導入頭文件#import <pthread.h>
25.6:自旋鎖、互斥鎖比較
1:什么情況使用自旋鎖比較劃算趋艘?
預計線程等待鎖的時間很短
加鎖的代碼(臨界區(qū))經常被調用疲恢,但競爭情況很少發(fā)生
CPU資源不緊張
多核處理器
2:什么情況使用互斥鎖比較劃算?
預計線程等待鎖的時間較長
單核處理器
臨界區(qū)有IO操作
臨界區(qū)代碼復雜或者循環(huán)量大
臨界區(qū)競爭非常激烈