美文网首页
GCD分析题

GCD分析题

作者: 等消息的人 | 来源:发表于2019-03-08 01:41 被阅读0次
__block NSInteger a = 0;
    while (a < 5) {
        //任务A
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            a ++;
            NSLog(@"加加操作a=%li", (long)a);
        });
    }
    //任务B
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"最后a=%li", (long)a);
    });

这道题的打印结果是什么形式?

分析:
1.a=0进入while代码块,dispatch_async创建异步任务A放入并发队列中,dispatch_async是非阻塞的,再次进行while(a<5)的判断,此时a++的操作在异步线程中可能还没有执行,再次创建异步任务A放入并发队列中。
2.在a>=5时可能已经创建了几十上百个异步任务A等待执行中,while循环结束。最后将异步任务B放入并发队列中,此时任务B在并发队列的最后。
3.由于任务A中的代码很短,运行时间也很短,所以任务队列中的任务几乎是顺序执行的。由于任务B最后执行,所以任务B打印a的最终值。
任务A中如果是加入[NSThread sleepForTimeInterval:0.01]等耗时操作结果就不确定了。

相关文章

网友评论

      本文标题:GCD分析题

      本文链接:https://www.haomeiwen.com/subject/xgxlpqtx.html