基本概念
進(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;
}