GCD简单介绍
同步任务: dispatch_sync 任务,不具备开启线程的能力
异步任务:dispatch_async 任务,具备开启线程的能力
串行队列:一个任务执行完才能执行下个队列任务,例如主队列 dispatch_get_main_queue()
并行队列:可以多个任务同时执行,例如全局队列dispatch_get_global_queue(0, 0)
自己创建的队列:并发队列 dispatch_queue_create("myquee", DISPATCH_QUEUE_CONCURRENT);
串行队列:dispatch_queue_create("myquee", DISPATCH_QUEUE_SERIAL);
想队列中添加任务,导致死锁问题解析,因为死锁只发生在同步任务 sync中,这里异步任务就不做多余的解释。
导致死锁的原因:线程间任务相互等待,例如:
- (void)viewDidLoad {
[super viewDidLoad];
//执行的任务1
dispatch_sync(dispatch_get_main_queue(), ^{
//执行的任务2
});
//执行的任务3
}
主线程中开启同步任务,将任务添加到主队列中,由于主队列是由上到下执行的,这个时候将串行任务添加到主队列中,导致阻塞,
任务1执行完,串行执行任务2,
任务2需要等待任务3执行完后再执行,
任务3在等待任务2执行完才会开始执行,
线程间相互等待导致死锁
PS:死锁只发生再同一个队列中,添加同步串行队列才会发生。分别向不同队列中添加,任务是不会造成死锁的。
网友评论