为何dispatch_sync在主线程会死锁

1.首先看下面一段代码函数

dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);spa

dispatch_sync(queue, ^{//taskA线程

//do something
dispatch_sync(queue, ^{//taskB
    //啥也干不了
});
复制代码

});code

dispatch_sync函数用于将一个block(任务)提交到队列中同步执行,直到block执行完后,这个函数才会返回。queue是一个串行队列,若是前后加入两个任务,taskA和taskB, 那么只有taskA执行完以后taskB才能执行。若是taskB是在taskA中加进队列的,那么它们依然遵照先进先出原则,即taskA执行完以后taskB才执行,也就是taskB在等待taskA完成。可是由于dispatch_sync的同步特性,taskB执行不完taskA就不算完成,即taskA在等待taskB的完成,这样就发生了死锁。队列

根据上面那份代码,咱们就能够理解下面的代码为何会阻塞主线程了。get

dispatch_queue_t mainQueue = dispatch_get_main_queue();同步

dispatch_sync(mainQueue, ^{class

NSLog(@"hello");
复制代码

});queue

mainQueue是系统建立的,在执行上面的代码以前就已经加进去了不少任务 dispatch_queue_t queue = dispatch_queue_create("Main", DISPATCH_QUEUE_SERIAL);di

dispatch_sync(queue, ^{

//Task A
复制代码

}); ... dispatch_sync(queue, ^{

//Task N
复制代码

});

在这N个任务里有一个任务是这样的: dispatch_sync(queue, ^{

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
    NSLog(@"hello");
});
复制代码

});

因此,发生死锁就是必然的了。

相关文章
相关标签/搜索