主线程死锁问题

dispatch_sync(dispatch_get_main_queue(), ^(){

       NSLog(@"222");

   });

这个死锁问题我自己的理解是这样的,dispatch_sync的第一个参数是主队列,意思是在主队列加一个同步任务,所以说任务是在主队列的主线程执行。

  而你将这段代码写在主线程中,意思是这个任务是由主线程去创建。

  所以问题来了:主线程里面加入了一个任务,既然是同步,所以主线程需要这个任务即打印222执行完才能做别的,而打印222这个任务要等主线程释放出来才能执行,所以block 等待主线程执行,主线程等待block 执行完成才去打印。死锁产生,下图:

主线程死锁问题_第1张图片
图片发自App

打印222永远执行不到,因为主线程要等打印222结束才能去执行打印222.

新的理解:dispatch_sync的第一个参数是代表block里面的操作在哪里执行,而dispatch_sync写在那个线程就代表哪个线程去创建这个任务。同步代表谁去创建谁就要去等待任务的block 执行完才能做别的事去。

如何解决:按照我上面的分析,要不主线程只管去创建,创建完了他就不管了,那就用dispatch_async执行任务的操作由新创建的线程去执行去。

要么:主线程不去创建了,由主线程去执行block即打印222,但是创建任务的工作分给其他线程去做:就是dispatch _sync这个语录不能写在主线程

- (void)viewDidLoad

{

   [super viewDidLoad];

   dispatch_async(dispatch_get_global_queue(0, 0), ^{

   dispatch_sync(dispatch_get_main_queue(), ^{

       NSLog(@"222");

   });

});

}

你可能感兴趣的:(主线程死锁问题)