iOS GCD-主线程同步执行死锁问题

  • 出自:huazhume

在使用GCD的过程中,会遇到许多线程死锁的问题,会导致程序循环等待,然后直到奔溃。下来我们就说说GCD主线程同步执行死锁。

那主线程同步执行是怎样的呢?

首先看这样的代码:

NSLog(@"start");
dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"middle");
});
NSLog(@"end");

执行结果:

iOS GCD-主线程同步执行死锁问题_第1张图片
Screen Shot 2017-10-14 at 5.46.57 PM.png
程序奔溃 打印结果: start

那么我们不禁要问,这样的死锁是如何产生的呢?!

是因为到程序执行到start的时候 ,sync创建了一个同步执行的线程(创建的线程称B,主线程称线程A),而因为B是同步线程,所以它必须要等待主线程A执行完之后才能去执行线程B,而这个时候线程B又嵌套在主线程A内,所以A和B开始竞争资源,产生死锁

那么主线程同步正确应该是怎样的呢?
NSLog(@"A");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
   dispatch_async(dispatch_get_main_queue(), ^{
       NSLog(@"线程同步");
   });
});
NSLog(@"B");
[NSThread sleepForTimeInterval:4];
NSLog(@"C");

执行结果:

iOS GCD-主线程同步执行死锁问题_第2张图片
Screen Shot 2017-10-14 at 6.01.23 PM.png

你可能感兴趣的:(iOS GCD-主线程同步执行死锁问题)