swift/OC中的死锁问题
先明确几个概念吧! &3.2 同步与异步 串行与并行针对的是队列,而同步与异步,针对的则是线程。 最大的区别在于,同步线程要阻塞当前线程,必须要等待同步线程中的任务执行完,返回以后,才能继续执行下一任务;而异步线程则是不用等待。 &3.3 GCD API GCD API很多,这里仅介绍本文用到的。 系统标准提供的两个队列 // 全局队列,一个特殊的并行队列dispatch_get_global_queue// 主队列,在主线程中运行,因为主线程只有一个,所以这是一个特殊的串行队列dispatch_get_main_queue复制代码 除此之外,还可以自己生成队列 // 从DISPATCH_QUEUE_SERIAL看出,这是串行队列dispatch_queue_create("com.demo.serialQueue",DISPATCH_QUEUE_SERIAL)// 同理,这是一个并行队列dispatch_queue_create("com.demo.concurrentQueue",DISPATCH_QUEUE_CONCURRENT)复制代码 同步与异步线程的创建: dispatch_sync(...,^(block))// 同步线程dispatch_async(...,^(block))// 异步线程 案例与分析 案例一: 当同步遇到了串行 NSLog(@"1"); // 任务1 dispatch_sync(dispatch_get_main_queue(),^{ ? ? NSLog(@"2");// 任务2 }); NSLog(@"3"); // 任务3 摘自??https://juejin.im/post/5d6542f76fb9a06b32608319? ? 小结 简单来说就是,在串行队列里添加同步线程(任务),线程中有(task1),task2 敲黑板了! 同步任务会阻塞当前线程并且将任务task1添加到队列(串行)中. 此时队列中的顺序是:? ?同步线程? ?task2? ?task1? 此时就出现了,先有的蛋还是先有的鸡的问题! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |