1. 創建線程的平均開銷:
內存堆棧: 主線程—— 1M , 子線程——512K
時間: 基本可以忽略不計
2. 創建線程的多種方法: www.aiwalls.com
NSThread, POSIX(基於C語言支持的API), NSObject的performSelector
3. 在工程沒有使用ARC時,線程執行體代碼中創建自動釋放池
4. 為瞭線程安全,盡量避免在線程中使用共享的數據結構
5. runloop: 線程中的一個事件處理循環,用來不停的調度工作以及處理輸入事件.
每一個線程都有自己的runloop, 主線程是默認開啟的,子線程是需要手動開啟。
runloop監視每個輸入源,處理事件,如果沒有事件,runloop休眠,不消耗CPU資源
需要使用runloop的四種情況:
a.使用端口或自定義輸入源和其他線程通信
b.子線程中使用瞭定時器
c.cocoa中使用任何performSelector到瞭線程中運行方法
d.使線程履行周期性任務
在子線程中用瞭NSURLConnection異步請求,那也需要用到runloop,不然線程退出瞭,相應的delegate方法就不能觸發。
6. 線程同步: a. 原子操作
b. 內存屏障和volatile變量
內存屏障: 確保內存操作按照正確順序工作的非阻塞同步工具
volatile : 一般編譯器會優化代碼通過加載這些變量的值進入寄存器。 對於線程之間共享的變量,使用volatile強制編譯器每次都從內存讀取數據,確保數據的同步。
c. 鎖: mutex, @synchronized()指令
d. 信號量
7. 線程安全設計技巧
a. 完全避免數據同步(可能性比較小)
b. 瞭解同步的限制
c. 註意對代碼正確性的威脅(保證數據同步安全,以及防止線程死鎖)
d. 盡量隻使用一個鎖進行數據同步保護,避免產生死鎖
e. 使用線程同步工具,
原子操作
鎖: 使用POSIX, NSLock(lock,unlock, tryLock), @synchronized()指令,包含隱式的異常處理例程來保護代碼,發生異常會釋放資源。
8. 線程安全總結:
a. 不可改變的對象,通常是線程安全的
b. 主線程負責處理響應事件
線程安全的類和函數: NSArray, NSData, NSNumber…..
非線程安全: NSBundle, NSCoder, NSArchiver, NSMutableArray
隻能用於主線程: NSAppleSript