GCD死锁的理解

- (void)viewDidLoad {
    [super viewDidLoad];
    [self sync];
}
- (void)sync {
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"Thread--%@", [NSThread currentThread]);
    dispatch_sync(queue, ^{
        NSLog(@"sync1--%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync2--%@", [NSThread currentThread]);
        dispatch_sync(queue, ^{
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync3--%@", [NSThread currentThread]);
    });
}
  1. 以上代码会造成死锁,原因是viewDidLoad函数会在主线程执行,当主线程中有任务在执行时,主队列内的任务会被阻塞。当代码执行到dispatch_sync时,会将block内的代码放入主队列。因为主队列被viewDidload阻塞了,所以block不会被执行。而dispatch_sync是同步函数,需要block执行完毕后才会返回,所以viewDidload和block相互阻塞,形成死锁。
  2. 如果将同步函数队列换成其他的其他队列,无论是串行队列还是并行队列都不会造成死锁。因为viewDidload被block阻塞时,block和viewDidload不在同一队列,block不会被viewDidload阻塞,当block自行完毕后viewDidload也会继续执行。
  3. 所以GCD的死锁和线程无关,是因为队列的阻塞造成了任务的相互阻塞才形成死锁。如果两个任务不在同一队列内就不会造成死锁。

你可能感兴趣的:(GCD死锁的理解)