产生线程阻塞的原因是:使用sync(同步)函数往当前串行队列(serial)中添加任务,这样会卡死在当前队列及出现死锁。
队列中的任务遵循FIFO原则,dispatch_sync是立马在当前线程同步执行任务,当在同一个队列的时候,出现相互等待,就造成了死锁。
死锁例子:
- (void)viewDidLoad {
[super viewDidLoad];
[self mainQueue];
}
-(void)mainQueue{
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"%@", [NSThread currentThread]);
});
}
原因:
程序运行的当前队列是主队列,主队列是特殊的串行队列,在串行队列中添加同步执行函数,就是要立马执行dispatch_sync函数里面的代码,但此时主队列还没有执行完毕无法释放CPU,又去执行主队列,造成任务卡死,出现死锁。
MAIN
- (void)viewDidLoad {
[super viewDidLoad];
[self myQueue];
}
-(void)myQueue{
dispatch_queue_t queue = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"%@", [NSThread currentThread]);
});
});
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"%@", [NSThread currentThread]);
});
});
}
两种方式都会照成死锁。队列中的任务遵循FIFO原则,dispatch_sync是立马在当前线程同步执行任务,当在同一个队列的时候,出现相互等待,就造成了死锁。
网友评论