29,027
社区成员
发帖
与我相关
我的任务
分享
dispatch_queue_t serialQueue = dispatch_queue_create("squeue", NULL);
// dispatch_queue_t mainQueue = dispatch_get_main_queue();
NSLog(@"Main Queue-->%@", dispatch_get_main_queue());
dispatch_sync(serialQueue, ^{ //如果用mainQueue就卡死
NSLog(@"Task 1-->%@", [NSThread currentThread]);
});
dispatch_queue_t squeue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
生成的squeue处于哪个线程?
本来,个人理解为squeue应该在主线程里,当把block插入到squeue里,因为只有该block一个任务,所以是正常的。但如果有嵌套任务如下:
dispatch_sync(squeue, ^{
NSLog(@"Task 1-->%@", [NSThread currentThread]);
dispatch_sync(squeue, ^{
NSLog(@"Task 2-->%@", [NSThread currentThread]);
});
});
此时Task 2是squeue的第2个任务,它必须等到串行队列的第1个任务Task 1执行完才能执行;而squeue的第1个任务要想执行完,就要往下执行Task 2的block,所以2个任务的起始条件互为结果,造成线程的直接制约,死锁。
另外,Task 1无论是sync还是async都会死锁,因为死锁的原因是任务调度顺序,而不是同步异步。
以上是原先的理解,现在回到提问本身来。
那么,同样是主线程里的串行队列dispatch_get_main_queue(),为什么就会卡死?
dispatch_async(dispatch_get_main_queue() ^{
NSLog(@"Task 1-->%@", [NSThread currentThread]);
});
NSRunLoop *rl = [NSRunLoop currentRunLoop];
[rl run];
为了撇清同异步影响,将sync换成async,同时为了让异步调用确实得到执行,运行一个runloop防止main()退出。
在main()中执行会直接卡死。此时是异步调用,按理说block插入到mainQueue中不用等待结果就可以返回了吧,为何也会卡死?
[/quote]
以上关于异步调用mainQueue,本人的说法是错误的,由于看混了sync和async。
更正:async调用mainQueue是正常的。请关注前面的问题。dispatch_queue_t squeue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
生成的squeue处于哪个线程?
本来,个人理解为squeue应该在主线程里,当把block插入到squeue里,因为只有该block一个任务,所以是正常的。但如果有嵌套任务如下:
dispatch_sync(squeue, ^{
NSLog(@"Task 1-->%@", [NSThread currentThread]);
dispatch_sync(squeue, ^{
NSLog(@"Task 2-->%@", [NSThread currentThread]);
});
});
此时Task 2是squeue的第2个任务,它必须等到串行队列的第1个任务Task 1执行完才能执行;而squeue的第1个任务要想执行完,就要往下执行Task 2的block,所以2个任务的起始条件互为结果,造成线程的直接制约,死锁。
另外,Task 1无论是sync还是async都会死锁,因为死锁的原因是任务调度顺序,而不是同步异步。
以上是原先的理解,现在回到提问本身来。
那么,同样是主线程里的串行队列dispatch_get_main_queue(),为什么就会卡死?
dispatch_async(dispatch_get_main_queue() ^{
NSLog(@"Task 1-->%@", [NSThread currentThread]);
});
NSRunLoop *rl = [NSRunLoop currentRunLoop];
[rl run];
为了撇清同异步影响,将sync换成async,同时为了让异步调用确实得到执行,运行一个runloop防止main()退出。
在main()中执行会直接卡死。此时是异步调用,按理说block插入到mainQueue中不用等待结果就可以返回了吧,为何也会卡死?
dispatch_sync(dispatch_get_main_queue() ^{
NSLog(@"Task 1-->%@", [NSThread currentThread]);
});
http://stackoverflow.com/questions/19180661/sync-dispatch-on-current-queue/19181474#19181474