iOS GCD 死锁理解
2016-05-19 本文已影响385人
FaiChou
同步(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
。
-“大圣,此去欲何?”
-“踏南天,碎凌霄。”
-“如若一去不回...”
-“便一去不回。”
有此等的英勇壮志奈何一个GCD乎?