关于GCD线程顺序的几个题,认识一下

相关标签:
//测试第一个CGD的运行结果
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"1");//主线程
//同步
dispatch_sync(queue, ^{
NSLog(@"2");//分线程
//同步
dispatch_sync(queue, ^{
NSLog(@"3");//分线程
});
NSLog(@"4");//分线程
});
NSLog(@"5");//主线程
//结果输出:1、2、3、4、5
//测试第二个CGD的运行结果
NSLog(@"111");//主线程
//异步
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"222");//分线程
//同步
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"333");//主线程
});
NSLog(@"444");//分线程
});
NSLog(@"555");//主线程
//结果输出:1、5、2、3、4
//测试第三个CGD的运行结果
NSLog(@"1..");//主线程
//同步
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2..");//主线程
});
NSLog(@"3..");//主线程
//结果输出:只有1,然后崩掉了,因为造成了线程锁死
/**
原因:对于主队列无论是同步异步都不会创建线程,而且主队列中的任务只有在主线程空闲的时候才会执行.如果是主队列同步会造成互相等待而锁死.主队列同步任务等待主线程执行,主线程之后的任务等待主队列任务完成。
解决办法:在主队列外面套一层并发队列的异步任务.或者使用主队列异步任务
**/
//解决第三个GCD线程锁死
NSLog(@"1..");//主线程
//异步
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2..");//主线程
});
NSLog(@"3..");//主线程
//结果输出:1、3、2
文章来源: https://blog.51cto.com/u_15894905/5892220
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报