4.1 線程
- 線程是運(yùn)行時(shí)執(zhí)行的一組指令序列
- 每個(gè)進(jìn)程至少應(yīng)包含一個(gè)線程
- 在iOS中,進(jìn)程啟動(dòng)時(shí)的主要線程通常稱作主線程
- 所有的UI元素都需要在主線程中創(chuàng)建和管理
- Cocoa編程不允許其他線程更新UI元素
- 涉及到UI操作的嵌屎,都會(huì)將上下文鞋換到主線程再更新UI
4.2 線程開銷
- 線程不僅有創(chuàng)建時(shí)的時(shí)間開銷,還會(huì)消耗內(nèi)核的內(nèi)存
- 每個(gè)線程大約消耗1KB的內(nèi)核內(nèi)存空間
- 這塊內(nèi)存用于存儲(chǔ)與線程有關(guān)的數(shù)據(jù)結(jié)構(gòu)和屬性哥放,此處無法被分頁
- 主線程的棧空間為1M吠式,而且無法修改
- 所有的二級線程默認(rèn)分配到512kb的棧空間
- 完整的棧并不會(huì)立即創(chuàng)建出來,實(shí)際的椂媪郏空間大小會(huì)隨著使用而增長,因此即使主線程有1MB的椇干玻空間某個(gè)時(shí)間點(diǎn)的實(shí)際椣等危空間很可能要小很多
- 在線程啟動(dòng)前恳蹲,椗翱椋空間的大小可以被改變,椉卫伲空間的最小值為16KB贺奠,而且其數(shù)值必須是4KB的倍數(shù)
- iPhone 6 plus iOS 8.4 創(chuàng)建線程耗時(shí)4-5毫秒
- 啟動(dòng)線程的耗時(shí)5-100毫秒,平均29毫秒错忱,開銷主要來源于上下文切換
4.3 GCD
4.4 操作與隊(duì)列
- NSOperation封裝了一個(gè)任務(wù)以及和任務(wù)相關(guān)的數(shù)據(jù)和代碼,而NSOperationQueue以先入先出的順序控制這一類任務(wù)的執(zhí)行
- NSOperation和NSOperationQueue都提供控制線程個(gè)數(shù)的能力以清,可以控制隊(duì)列的個(gè)數(shù)也能控制每個(gè)隊(duì)列的線程個(gè)數(shù)
- GCD:
1.抽象程度最高
2.兩種隊(duì)列開箱即用:main和global
3.可以創(chuàng)建更多的隊(duì)列
4.可以請求獨(dú)占(dispatch_barrier_sync和dispatch_barrier_async)
5.基于線程管理
6.硬性限制創(chuàng)建64個(gè)線程
- NSOperationQueue:
1.無默認(rèn)隊(duì)列
2.應(yīng)用管理自己創(chuàng)建的隊(duì)列
3.隊(duì)列是優(yōu)先級隊(duì)列
4.操作可以有不同的優(yōu)先級(queuePriority屬性)
5.使用cancel消息可以取消操作儿普,注:cancel只是標(biāo)記,如果操作已經(jīng)開始執(zhí)行掷倔,則可能會(huì)繼續(xù)執(zhí)行下去
6.可以等待某個(gè)操作執(zhí)行完畢
- NSThread:
1.低級別構(gòu)造眉孩,最大化控制
2.應(yīng)用創(chuàng)建并管理線程
3.應(yīng)用創(chuàng)建并管理線程池
4.應(yīng)用啟動(dòng)線程
5.線程可以擁有優(yōu)先級,操作系統(tǒng)會(huì)根據(jù)優(yōu)先級調(diào)度他們的執(zhí)行
6.無直接API用于等待線程完成,需要使用互斥量(NSLock)和自定義代碼
- NSOperationQueue是多核安全
4.5.1 原子屬性
- 線程安全通俗的理解為:多個(gè)線程并行執(zhí)行勒葱,不會(huì)產(chǎn)生任何副作用
- 標(biāo)記為atomic只能阻止并行修改 ,并不能保證線程安全
4.5.2 同步塊
- 使用@synchronized保證了任何時(shí)候都只能被一個(gè)線程執(zhí)行浪汪,使用如下:
@synchronized(instance){
}
4.5.3 鎖
- 鎖可以認(rèn)為是低級別工具,atomic和@synchronized為高級封裝(抽象)
- (instancetype)init {
self = [super init];
if (self) {
self -> lock = [NSLock new];
self -> reLock = [NSRecursiveLock new];
}
return self;
}
- (void)test {
[self->lock lock];
//線程安全的代碼
[self->lock unlock];
}
- (void)test {
[self->lock lock];
//線程安全的代碼
NSLog(@"test");
[self test1];
[self->lock unlock];
}
- (void)test1 {
//會(huì)死鎖
[self->lock lock];
NSLog(@"test1");
[self->lock unlock];
}
- (void)test2 {
[self->reLock lock];
//線程安全的代碼
NSLog(@"test2");
[self test3];
[self->reLock unlock];
}
- (void)test3 {
[self->reLock lock];
//線程安全的代碼
NSLog(@"test3");
[self->reLock unlock];
}
- NSCondition:
- 生產(chǎn)者死遭、消費(fèi)者
@interface Producer:NSObject
@property (nonatomic, strong) NSCondition *condition;
@property (nonatomic, strong) NSMutableArray *collector;
@property (nonatomic, assign) BOOL shouldProduce;
- (instancetype)initWithCondition:(NSCondition *)condition collector:(NSMutableArray *)collector;
- (void)produce;
@end
@implementation Producer
- (instancetype)initWithCondition:(NSCondition *)condition collector:(NSMutableArray *)collector {
if (self = [super init]) {
self.condition = condition;
self.collector = collector;
self.shouldProduce = NO;
}
return self;
}
- (void)produce {
self.shouldProduce = YES;
while (self.shouldProduce) {
[self.condition lock];
if (self.collector.count) {
[self.condition wait];
}
[self.collector addObject:@"x"];
[self.collector addObject:@"x"];
NSLog(@"produce");
[self.condition signal];
[self.condition unlock];
}
}
@end
@interface Customer:NSObject
@property (nonatomic, strong) NSCondition *condition;
@property (nonatomic, strong) NSMutableArray *collector;
@property (nonatomic, assign) BOOL shouldConsume;
- (instancetype)initWithCondition:(NSCondition *)condition collector:(NSMutableArray *)collector;
- (void)consume;
@end
@implementation Customer
- (instancetype)initWithCondition:(NSCondition *)condition collector:(NSMutableArray *)collector {
if (self = [super init]) {
self.condition = condition;
self.collector = collector;
self.shouldConsume = NO;
}
return self;
}
- (void)consume {
self.shouldConsume = YES;
while (self.shouldConsume) {
[self.condition lock];
if (self.collector.count) {
[self.condition wait];
}
[self.collector removeObjectAtIndex:0];
NSLog(@"consume");
[self.condition signal];
[self.condition unlock];
}
}
@end
4.5.4 將讀寫鎖應(yīng)用于并發(fā)讀寫
- 并行讀取,寫入互斥的一種機(jī)制--讀寫鎖
- 可以用(dispatch_barrier_sync或dispatch_barrier_async)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者