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

来源:互联网 发布:手机版经传软件 编辑:程序博客网 时间:2024/06/03 17:18

//测试第一个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");//主线程

    //结果输出:12345

    

    //测试第二个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");//主线程

    //结果输出:15234

    

    //测试第三个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..");//主线程

    //结果输出:132


知识点看我的这篇博客:http://blog.csdn.net/hbblzjy/article/details/51235990





原创粉丝点击