我正在尝试了解iOS GCD的并发队列。
我编写了一些代码对其进行测试,但发现有些奇怪。
代码如下:
_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
for (int index = 0; index < 3; ++index) {
dispatch_sync(_syncQueue, ^{
NSLog(@"sync@@@@@@ >>>> %d ",index);
sleep(1);
NSLog(@"sync@@@@@@ <<<< %d ",index);
});
}
for (int index = 3; index < 6; ++index) {
dispatch_async(_syncQueue, ^{
NSLog(@"sync===== >>>> %d ",index);
sleep(1);
NSLog(@"sync===== <<<< %d ",index);
});
}
for (int index = 6; index < 9; ++index) {
dispatch_sync(_syncQueue, ^{
NSLog(@"sync***** >>>> %d ",index);
sleep(1);
NSLog(@"sync***** <<<< %d ",index);
});
}
sync@@@@@@ >>>> 0
sync@@@@@@ <<<< 0
sync@@@@@@ >>>> 1
sync@@@@@@ <<<< 1
sync@@@@@@ >>>> 2
sync@@@@@@ <<<< 2
sync***** >>>> 6
sync===== >>>> 4
sync===== >>>> 3
sync===== >>>> 5
sync***** <<<< 6
sync***** >>>> 7
sync===== <<<< 4
sync===== <<<< 5
sync===== <<<< 3
sync***** <<<< 7
sync***** >>>> 8
sync***** <<<< 8
你问:
dispatch_sync
。这实际上表示“停止当前线程,直到分派的任务完成为止”。因此,在使用先前的dispatch_sync
调度的任务完成之前,第一个循环甚至不会到达其自身循环的下一个迭代。dispatch_sync
调用是红色的Ⓢ标志。您可以看到,直到第一个被分配的任务完成后,才开始分配第一个循环的第二个迭代。NSLog
语句。如果您查看与这些NSLog
语句相关联的时间戳,它们之间的距离非常接近(与第一个循环的NSLog
语句不同)。dispatch_sync
。第二个循环使用的dispatch_async
必须做很多工作,即GCD必须从池中获取一个工作线程并在该线程上启动任务。但是,作为优化,第三个循环的dispatch_sync
通常只是在当前线程上运行分派的任务。 (如果线程无论如何都要等待分派的任务,为什么不只使用它来运行任务并完全避免上下文切换。)dispatch_sync
任务比在大约同一时间在同一并发队列上启动的dispatch_async
更快地启动。dispatch_sync
和dispatch_async
调用。关于ios - 为什么并发队列的行为怪异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49538333/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |