iOS多線程編程概要總結 – iPhone手機開發技術文章 iPhone軟體開發教學課程

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 

 

 

發佈留言