- 出自:huazhume
在使用GCD
的过程中,会遇到许多线程死锁的问题,会导致程序循环等待,然后直到奔溃。下来我们就说说GCD
主线程同步执行死锁。
那主线程同步执行是怎样的呢?
首先看这样的代码:
NSLog(@"start");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"middle");
});
NSLog(@"end");
执行结果:
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");
执行结果:
Screen Shot 2017-10-14 at 6.01.23 PM.png
网友评论