首先清楚一点就是dispatch_sync程序需等待这个结果才执行下一步,dispatch_async无需等待结果继续执行下一步。
//注:这里的任务不要单纯看作是一个简单的log输出,也可以是一个复杂的操作。
简单异步操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务1");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
});
NSLog(@"任务4");
//任务1、4随机输出
//任务3和任务1在一个队列,所以任务3在任务1后面输出
//任务2加入了主队列,添加在主队列最后面所以在任务4后面输出
最简单的死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"任务1");
});
NSLog(@"任务2");
//死锁 无输出。因为任务1加入了主队列最后面,等待任务2完成;而这时因为dispatch_sync所以任务2又在等待任务1完成所以就造成了死锁
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
});
NSLog(@"任务4");
//任务1、4随机输出
//因为dispatch_sync 任务3等待任务2完成,又因为任务2加入的是主队列,所以任务2等待任务4完成。所以执行顺序是任务4->任务2->任务3
dispatch_queue_t serialQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
NSLog(@"任务1");
dispatch_sync(serialQueue, ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
});
NSLog(@"任务4");
//任务1、4随机输出
//死锁 任务2和任务3不执行。原因:因为serialQueue是串行队列,所以同步时把任务2添加到任务3后面,又因为同步任务3等待任务2完成,所以就造成了死锁。
注:如果serialQueue是并发队列就不会造成死锁,因为并发队列并不会把任务2添加到任务3后面。还有值得注意的是dispatch_get_global_queue是并发队列,所以平时一直用的这个也没遇到过死锁吧。
这些都是本人对线程的一些理解,如有错误请指正。