一段GCD函数执行过程的理解

//在主线程执行
- (void)testGCD
{
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    });
    NSLog(@"4");
    while (1) {
        
    }
    NSLog(@"5");
}

问主线程执行testGCD后控制台打印的结果是什么?

dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    });

以上部分会异步将block任务提交到一个全局并行队列中,该任务我们记为async_task;同时主线程下面的代码可以称为main_task

NSLog(@"4");
    while (1) {
        
    }
    NSLog(@"5");

可以知道async_taskmain_task是并发执行的,因此执行结果可能有两种情况:先打印4后打印1或者相反(235下面讨论);

这时关注async_task里的dispatch_sync任务,我们记作sync_task

这个任务会同步提交到主队列等待执行,返回后才会打印3。

而在sync_task前面串行等待的任务还有main_task,也就是sync_task要等待main_task执行完才执行。

而这里的main_task包含一个while(1){}的死循环代码,因此永远执行不完,那么sync_task就会一直等待,这就造成一个持续等待的局面。

简单点说就是,2被5卡住了,3被2卡住了。

因此不仅2无法打印,3和5也打印不出来。
所以最终结果是4, 1或者1, 4

你可能感兴趣的:(一段GCD函数执行过程的理解)