您的位置:首页 > 移动开发 > IOS开发

iOS GCD 死锁理解

2017-04-09 00:00 253 查看
同步(dispatch_sync):

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。

不同线程可以执行不同队列的任务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐