主线程死锁问题

dispatch_sync(dispatch_get_main_queue(), ^(){

       NSLog(@"222");

   });

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

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

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

图片发自简书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");

   });

});

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容