GCD多线程面试案例分析与结果
- 事例1
- (void)interview01
{
// 问题:以下代码是在主线程实施的,会不会发生死锁?会!
NSLog(@"viewDid1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"实施使命2");
});
NSLoappleg(@"ViewDid3");
// dispatch_sync立马在其时线程同步实施使命
}
- 效果
-
- “实施使命2”使命添加到主部队(特别的串行部队),其时线程是主线程,使命呗添加到主线程中实施
- sync是不会翻开新的线程。 同步串行
- 所以会堵塞线程等候主线程中上一个使命完结后才调实施下一个使命。
- dispatch_sync立马在其时线程同步实施使命,实施完毕才调往下实施。
- 在使命1实施进程中要实施使命2,一同使命二实施完后还有剩余的使命1接着做,可是机器的逻辑是实施1完毕才调实施2,实施完2后才调持续实施剩余的使命1,导致了任appointment务1和使命2在相互等候对方实施完毕。死锁了。
-
事例2
- (void)interview02
{appearance
// 问题:以下代码是在主线程实施的,会不会发生死锁?不会!
NSLog(@"实施使命1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(quapproveeue, ^{
NSLog(@"实施APP使命2");
});
NSLog(@application"实施使命3");
// dispatch_async不要求立马在其时线程同步实施使命
}
- 异步串行,没有翻开新的线程
- 效果 不会发生死锁。
- 剖析
- viewdidLoad是使命1正在实施
- 使命2参加,可是这个使命是异步实施,可以先等等的使命
- 等使命1完结后再做使命2
- 我这加了一个viewwillAppear 说明这个打印2是先等viewdidload实施完结后才实施的。
- 事例3
- (void)interview03
{
// 问题:以下代码是在主线程实施的,会不会发生appstore死锁?会!
NSLog(@"实施使命1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIapproveAL);
dispatch_async(queue, ^{ // 0
NSLog(app装置下载@"实施使命2");
dispatch_sync(queue, ^{ // 1
NSLog(@"实施使命3");
});
NSLog(@"实施使命4");
});
NSLog(@"实施使命5");
}appstore
- 效果
- 剖析
- 这个剖析与第一个相似
- 事例4
{
// 问题:以下代码是在主线程实施的,会不会发生死锁?不会!
NSLog(@"实施使命1");
//并发部队在运转的进程中会翻开新的子线程来完结工作
dispatch_queue_t queue2 = dispatch_queue_create("myqueu2", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue2, ^{ // 0
NSLog(@"实施使命2");
dispatch_sync(queue2, ^{ // 1
NSLog(@"实施任appear务3");
});application
NSLog(@"实施使命4");
})appearance;
NSLog(@"实施使命5");
}
总结
在串行部队中(不会翻开新线程),在一个使命中不要同步参加新的使命,这样会发生死锁。
部队
dispatch_queue_t queuapp装置下载e1 = dispatch_get_gloappstorebaapprovel_queue(0, 0);
dappointmentispatch_queue_t queapproveue2 = dispatch_get_global_queue(0, 0);
dispatch_queue_t queue3 = dispatch_queue_create("queu3", DISPATCH_QUEUE_CONCURRENT);
dispatch_qapp装置下载ueue_t queue4 = dispatch_queue_create("queu4", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue5 = dispatch_queue_create("queu5", DISPATCH_QUEUE_COappreciateNCURRENT);
dispatcapp装置下载h_queue_t queueapprove6 = dispatch_queue_create("queu6",approve DISPATappleCH_QUEUE_SERIAL);
- 全局并发部队
- 并发部队
- 串行部队