国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS多線程-01-pthread與NSTread

2019-11-14 18:27:49
字體:
來源:轉載
供稿:網友

簡介


  • 恰當的使用多線程編程可以提供任務的執行效率和系統資源的利用率

    • 多線程是為了提高資源利用率,和應用程序的響應速度,多個線程共享應用資源
    • 每個應用程序都有一個主線程,通常用來做UI界面刷新等
    • 比較耗時的任務如果放在主線程中,可能會造成主線程的堵塞,無法響應用戶操作,通常為耗時任務創建自己的線程,與主線程并發執行
  • 多線程編程在一定程度上提高了系統資源的利用率和任務處理速度,但是線程不易過多,否則會引發以下問題。

    • 過多的線程會造成處理機的頻繁調度,線程調度需要消耗大量的系統資源。
    • 同一進程下的多個線程共享進程的資源,多個線程對資源的訪問需要實現同步,若線程過多會增加同步的難度,甚至無法實現。

iOS開發中實現多線程的方式


  • pthread

    • 跨平臺,適用于多種操作系統,可移植性強
    • 是一套純C語言的通用API,且線程的生命周期需要程序員自己管理,使用難度較大,通常不使用
  • NSThread

    • 基于OC語言的API,使得其簡單易用,面向對象操作
    • 線程的聲明周期由程序員管理,偶爾使用
  • GCD

    • 基于C語言的API,充分利用設備的多核,旨在替換NSThread等線程技術
    • 線程的生命周期,由系統自動管理,經常使用
  • NSOperation

    • 基于OC語言API,底層是GCD,增加了一些更加簡單易用的功能,使用更加面向對象
    • 線程生命周期由系統自動管理,經常使用

pthread


  • 創建線程

    • 定義線程變量:

      • pthread_t thread
    • 初始化線程變量:

      • pthread_create(&thread, NULL, run, NULL)
  • 設置/獲取線程的并發執行數

    • 設置并發執行數:

      • int pthread_setconcurrency(int)
    • 獲取線程的并發執行數:

      • int pthread_getconcurrency(void)
  • 執行單次任務(通常用來設計單例模式)

    • 定義標記:

      • pthread_once_t onceToken
    • 執行單次任務:

      • int pthread_once(pthread_once_t *, void (*)(void))
  • 將線程狀態轉化為unjoinable狀態,確保資源的釋放

    • int pthread_detach(pthread_t)
  • 退出線程

    • void pthread_exit(void *)

NSThread


  • 線程的生命周期操作

    • 創建線程的方法

      • - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument,此方法創建的線程需要手動啟動
      • + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument,創建線程后自動啟動
      • - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg,隱式創建線程并啟動
    • 配置線程

      • 通過name屬性設置線程名字
      • + (BOOL)setThreadPRiority:(double)p設置線程的優先級
    • 啟動線程

      • - (void)start
    • 阻塞線程

      • + (void)sleepUntilDate:(NSDate *)date
      • + (void)sleepForTimeInterval:(NSTimeInterval)ti
    • 取消線程

      • - (void)cancel,當前正在執行的線程不會立刻停止
    • 強制退出線程

      • + (void)exit
  • NSThread的其他操作

    • 與主線程相關

      • + (NSThread *)mainThread,獲取主線程
      • + (BOOL)isMainThread,判斷當前線程是不是主線程
    • 與當前線程相關

      • + (NSThread *)currentThread,獲取當前線程
    • 判斷線程的狀態

      • /通過executing屬性判斷線程是否正在執行
      • /通過finished屬性判斷線程是否執行完畢
      • /通過cancelled屬性判斷線程是否被取消
  • 線程同步

    • 原因:多個線程訪問同一資源,很可能會引起數據錯亂和數據安全問題
    • 解決方案:使用互斥鎖來解決互斥資源訪問問題,(鎖){}對臨界資源進行鎖定,通常使用self作為鎖
    • 注意:由于線程同步會消耗大量的資源,應盡量避免多個線程訪問同一資源,且通常將線程同步的邏輯交由服務器端實現
  • 線程之間的通信

    • 從子線程回到主線程
      - - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array
      - array指定runLoop的模式,若為空,則不執行aselector
      - 方法的調用者即為aselector的調用者
      - - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
    • 從一個線程到另一個線程(包括主線程)
      - - (void)performSelector:(SEL)aSelector onThread:(NSThread )thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray )array
      - - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait
    • 也可以通過NSPort對象實現通信

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大化| 龙里县| 宜君县| 保亭| 叶城县| 扎囊县| 夏邑县| 黄冈市| 六枝特区| 扶风县| 扬州市| 四子王旗| 乌兰浩特市| 吴桥县| 伊吾县| 岐山县| 农安县| 吉木乃县| 唐海县| 黄冈市| 京山县| 平利县| 祁门县| 桂林市| 逊克县| 来安县| 鄂伦春自治旗| 汾西县| 扎赉特旗| 鄯善县| 上蔡县| 青阳县| 安仁县| 嵊泗县| 景宁| 林州市| 新化县| 莒南县| 延长县| 革吉县| 贞丰县|