多线程之死锁

死锁场景

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSThread *thread = [NSThread currentThread];
    NSLog(@"** 当前线程:%@ **",thread);
    
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSThread *thread = [NSThread currentThread];
        NSLog(@"** 主线程:%@ **",thread);
    });
}

解释

一共有 2 个任务,任务 A(正在执行源代码) 是把任务 B 添加到主线程,并且要等到任务 B(block中的任务) 执行完毕。但是任务 A 正在占用主线程,所以任务 B 无法执行。所以任务 A 也无法完成。

同步和异步

1.异步调度 dispatch_async : 把一个任务添加到某queue后就马上离开,而不管任务在那个queue里的执行状态

2.同步调度 dispatch_sync : 把一个任务添加到某queue后,等这个任务完成,调用线程才继续执行.

所以,异步调度和同步调度的区别不在于被添加的任务怎样执行,而在于调用线程是否等待任务执行完。

注意:串行 queue 每次只能执行一个任务,可以使用它来代替锁,保护共享资源或可变的数据结构,串行queue确保任务按可预测的顺序执行(这是比锁好的地方)

参考:

关于GCD中的串行,并行,同步,异步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容