iOS GCD 死锁理解
2017-04-09 00:00
253 查看
同步(dispatch_sync):
输出:“1234”。
异步(dispatch_async):
上面代码执行结果可能为 “1234”、“1243”、“2134”、“2143”、“2413”中的一种,2 始终在 4 前面,1 始终在 3 前面,2 始终在 3 前面。
死锁
输出: 1。
如图所示,代码中dispatch_sync(dispatch_get_main_queue(), ^{ });会获取主线程(当前线程)阻塞之,执行完任务1就不会继续走任务2,它会把任务2放到任务3后面,等到任务2执行完才会打通阻塞的地方继续执行,可是任务2不可能执行完,因为主线程已经堵住了~
Go on
输出: 1 2 3。
Go on
输出:1 5 2 或 1 2 5 。
Go on
输出: 12534或15234。
Go on
输出:14或41。
不同线程可以执行不同队列的任务
dispatch_sync(fcQueue, ^{ NSLog(@"1"); // 任务 1 }); NSLog(@"2"); // 任务 2 dispatch_sync(fcQueue, ^{ NSLog(@"3"); // 任务 3 }); NSLog(@"4"); // 任务 4
输出:“1234”。
异步(dispatch_async):
dispatch_async(serialQueue, ^{ NSLog(@"1"); //任务 1 }); NSLog(@"2"); dispatch_async(serialQueue, ^{ NSLog(@"3"); //任务 3 }); NSLog(@"4");
上面代码执行结果可能为 “1234”、“1243”、“2134”、“2143”、“2413”中的一种,2 始终在 4 前面,1 始终在 3 前面,2 始终在 3 前面。
死锁
NSLog(@"1"); // 任务1 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); // 任务2 }); NSLog(@"3"); // 任务3
输出: 1。
如图所示,代码中dispatch_sync(dispatch_get_main_queue(), ^{ });会获取主线程(当前线程)阻塞之,执行完任务1就不会继续走任务2,它会把任务2放到任务3后面,等到任务2执行完才会打通阻塞的地方继续执行,可是任务2不可能执行完,因为主线程已经堵住了~
Go on
NSLog(@"1"); // 任务1 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@"2"); // 任务2 }); NSLog(@"3"); // 任务3
输出: 1 2 3。
Go on
dispatch_queue_t queue = dispatch_queue_create("com.fcDemo.serialQueue", DISPATCH_QUEUE_SERIAL); NSLog(@"1"); // 任务1 dispatch_async(queue, ^{ NSLog(@"2"); // 任务2 dispatch_sync(queue, ^{ NSLog(@"3"); // 任务3 }); NSLog(@"4"); // 任务4 }); NSLog(@"5"); // 任务5
输出:1 5 2 或 1 2 5 。
Go on
NSLog(@"1"); // 任务1 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"2"); // 任务2 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"3"); // 任务3 }); NSLog(@"4"); // 任务4 }); NSLog(@"5"); // 任务5
输出: 12534或15234。
Go on
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1"); // 任务1 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); // 任务2 }); NSLog(@"3"); // 任务3});
NSLog(@"4"); // 任务4
while (1) {
}
NSLog(@"5"); // 任务5
输出:14或41。
不同线程可以执行不同队列的任务
相关文章推荐
- iOS开发中GCD在多线程方面的理解
- iOS开发中GCD在多线程方面的理解
- iOS GCD使用_理解
- Objective-C iOS多线程之GCD深入理解
- iOS小明开发笔记(五) (GCD死锁及解决方案)
- IOS GCD 的理解
- IOS深入理解GCD之dispatch_sync
- 理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念
- iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)
- iOS - GCD 之线程死锁
- iOS -- 线程 还有待补全--(关于线程死锁,解决办法等。。)(NSThread、NSOperation、GCD) -- ASI/AFNetWork
- iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁
- (转)iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等
- iOS开发之深入理解GCD
- iOS 之GCD串行和并发队列的理解
- iOS开发中GCD在多线程方面的理解
- iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等
- IOS开发—深入理解 GCD(一)
- iOS开发:深入理解GCD 第一篇
- iOS陆哥开发笔记(八) (GCD死锁及解决方案)