IOS中實現(xiàn)多線程的方法

基本概念

  • 進(jìn)程是指在系統(tǒng)中正在運行的一個應(yīng)用程序,每個進(jìn)程之間是獨立的,每個進(jìn)程均運行在其專用且受保護(hù)的內(nèi)存空間內(nèi)

  • 線程

    • 1個進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每1個進(jìn)程至少要有1條線程)
    • 1個進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行
  • 線程的串行

    • 一個線程中任務(wù)的執(zhí)行時串行的,就是在同一時間內(nèi),1個線程只能執(zhí)行1個任務(wù)
    • 在1個線程中執(zhí)行多個任務(wù),只能一個一個地按順序執(zhí)行這些任務(wù)
  • 多線程

    • 1個進(jìn)程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務(wù)

    • 多線程的優(yōu)點

      • 能適當(dāng)提高程序的執(zhí)行效率
      • 能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)
    • 多線程的缺點

      • 創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、??臻g(子線程512KB、主線程1MB,也可以使用-setStackSize:設(shè)置,但必須是4K的倍數(shù),而且最小是16K),創(chuàng)建線程大約需要90毫秒的創(chuàng)建時間
      • 如果開啟大量的線程,會降低程序的性能
      • 線程越多,CPU在調(diào)度線程上的開銷就越大
      • 程序設(shè)計更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享
      • 耗電、發(fā)熱

多線程在IOS中的應(yīng)用

  • 一個iOS程序運行后,默認(rèn)會開啟1條線程,稱為“主線程”或“UI線程”
    • 主線程的主要作用
      顯示\刷新UI界面
      處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
    • 主線程的使用注意
      別將比較耗時的操作放到主線程中
      耗時操作會卡住主線程,會嚴(yán)重影響UI的流暢度

IOS中實現(xiàn)多線程的方法

image.png

pthread簡單使用

pthread 屬于 POSIX 多線程開發(fā)框架,是UNIX環(huán)境創(chuàng)建線程函數(shù)

函數(shù)介紹:

        參數(shù):
        1.指向線程代號的指針
        2.線程的屬性
        3.指向函數(shù)的指針
        4.傳遞給該函數(shù)的參數(shù)
     
        返回值
        - 如果是0,標(biāo)示正確
        - 如果非0,標(biāo)示錯誤代碼  
        int pthread_create(pthread_t _Nullable * _Nonnull __restrict,
                            const pthread_attr_t * _Nullable __restrict,
                            void * _Nullable (* _Nonnull)(void * _Nullable),
                            void * _Nullable __restrict);
                            

使用:

        pthread_t threadID;
        NSString *str = @"testPthread";
        /**
        - 在 ARC 開發(fā)中,如果涉及到和C語言中的相同的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,需要使用 __bridge "橋接"
        - 在 MRC 不需要
        */
        int result = pthread_create(&threadID, NULL, &demo, (__bridge void *)(str));
    
        if (result == 0) {
            NSLog(@"OK");
        }else{
            NSLog(@"error %d",result);
        }
    

需要異步執(zhí)行的代碼寫到函數(shù)中,取函數(shù)地址傳入到pthread_create 第三個參數(shù)

        void * demo(void * param){
                NSLog(@"%@ %@",[NSThread currentThread],param);
                return NULL;
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,215評論 8 265
  • iOS多線程實踐中,常用的就是子線程執(zhí)行耗時操作,然后回到主線程刷新UI。在iOS中每個進(jìn)程啟動后都會建立一個主線...
    jackyshan閱讀 1,572評論 2 12
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,913評論 0 17
  • 今天調(diào)休,早上送孩子上學(xué)?;貋砺飞夏慷靡荒唬苁蔷拘?。 先是聽見孩子哭的聲音,扭頭一看,一個媽媽在前面匆忙疾走,一...
    木木sani閱讀 109評論 0 0
  • 今天記錄一下 ijk ,ijk 默認(rèn)不支持播放 RTSP 的,下面就說一下如何配置 ijk 讓其支持播放 RTSP...
    今天_現(xiàn)在閱讀 4,676評論 2 7

友情鏈接更多精彩內(nèi)容