前言
在日常開發(fā)中卦羡,多線程的使用能幫助我們解決很多問題功氨,比如大量數(shù)據(jù)的運算,復(fù)雜程序的執(zhí)行刊懈,以及利用鎖來實現(xiàn)一些需求这弧,本系列文章主要介紹 iOS 中多線程實現(xiàn)技術(shù)的用法。
多線程
一個進程中可以開啟多條線程虚汛,每條線程可以并行執(zhí)行不同的任務(wù)匾浪,以充分利用資源,提高運算效率卷哩。多線程原理
同一時間蛋辈,CPU 只能處理 1 條線程,只有 1 條線程在執(zhí)行将谊,多線程并發(fā)執(zhí)行冷溶,其實是 CPU 快速地在多條線程之間調(diào)度(切換)渐白,如果 CPU 調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象挂洛,并不是 CPU 在同一時刻同時執(zhí)行多個任務(wù)礼预。優(yōu)點
能適當(dāng)提高程序的執(zhí)行效率;
能適當(dāng)提高資源利用率(CPU虏劲、內(nèi)存利用率)托酸。缺點
開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下,主線程占用1M柒巫,子線程占用512KB)励堡,如果開啟大量的線程,會占用大量的內(nèi)存空間堡掏,降低程序的性能应结;
線程越多,CPU 在調(diào)度線程上的開銷就越大泉唁。
在 iOS 中鹅龄,多線程解決方案主要有以下四種:
這篇文章我們先來介紹 pthread
pthread 簡介
pthread 是一套通用的多線程的 API,可以在Unix / Linux / Windows 等系統(tǒng)跨平臺使用亭畜,使用 C 語言編寫扮休,需要程序員自己管理線程的生命周期,使用難度較大拴鸵。
pthread 簡單使用
NSLog(@"%s : %@", __func__, [NSThread currentThread]);
/************************** 創(chuàng)建線程 *************************/
// pthread
pthread_t thread = NULL;
NSString *paramStr = @"paramStr";
// 可接收返回值判斷線程有沒有創(chuàng)建成功 0 成功 !0 失敗
int res = pthread_create(&thread, // 線程對象玷坠,傳遞地址
NULL, // 線程屬性,可設(shè)置為null
pthreadMethod, // 指向函數(shù)的指針
(__bridge void *)(paramStr)); // 函數(shù)需要接受的參數(shù)劲藐,可為null
if (res == 0) {
NSLog(@"線程創(chuàng)建成功八堡!pthread begin");
}
// 設(shè)置子線程的狀態(tài)為 detached, 則該線程運行結(jié)束后會自動釋放所有資源,或者在子線程中添加 pthread_detach(pthread_self()),其中 pthread_self() 是獲得線程自身的 id
pthread_detach(thread);
NSLog(@"pthread end");
// pthread執(zhí)行方法
void *pthreadMethod(void *parma) {
for (NSInteger i = 0; i < 5; i++) {
NSLog(@"%ld --> %s : %@ param: %@", i, __func__, [NSThread currentThread], (__bridge NSString *)(parma));
[NSThread sleepForTimeInterval:1.0]; // 模擬耗時
}
return NULL;
}
pthread_create()
就是創(chuàng)建線程的方法聘芜,只需填寫四個參數(shù)兄渺,就可以創(chuàng)建線程,我們來看一下輸出
pthreadMethod()
的方法是在子線程執(zhí)行汰现,而主線程的輸出先于子線程執(zhí)行挂谍,說明子線程的耗時任務(wù)不會影響主線程的執(zhí)行邏輯。
pthread 其他方法及參數(shù)
pthread_t
: 線程ID
pthread_attr_t
: 線程屬性
pthread_create()
: 創(chuàng)建一個線程
pthread_exit()
: 終止當(dāng)前線程
pthread_cancel()
: 中斷另外一個線程的運行
pthread_join()
: 阻塞當(dāng)前的線程服鹅,直到另外一個線程運行結(jié)束
pthread_attr_init()
: 初始化線程的屬性
pthread_attr_setdetachstate()
: 設(shè)置脫離狀態(tài)的屬性
pthread_attr_getdetachstate()
: 獲取脫離狀態(tài)的屬性
pthread_attr_destroy()
: 刪除線程的屬性
pthread_kill()
: 向線程發(fā)送一個信號
pthread_equal()
: 對兩個線程的線程標(biāo)識號進行比較
pthread_detach()
: 分離線程
pthread_self()
: 查詢線程自身線程標(biāo)識號
以上是關(guān)于 pthread
的介紹和簡單使用的說明凳兵,相關(guān) demo 請參考
https://github.com/G-Jayson/Multi-thread