以下代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"HIGH 1 %d", i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"LOW %d", i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"HIGH 2 %d", i);
}
});
导致高1,高2和低原木的混合。
如何同时打印high1和high2日志。在同一个队列中不是high1和high2博客?那么在开始执行high2块之前,不应该将high1块完成吗?
答案 0 :(得分:22)
这取决于您正在运行的机器。我怀疑你在Mac上运行它,因为GCD会自动为特定系统创建足够的线程来处理全局队列中的作业。因此,您可能拥有多个核心,因此GCD正在两个核心上运行您的作业。
如果使用dispatch_queue_create
创建队列,则会得到一个串行队列,然后保证FIFO行为。
FWIW(虽然你不应该依赖这种行为),如果你在iPhone上运行它,我怀疑你会看到串行队列行为,因为你的iPhone是单核的。不要依赖于此,我认为iPad 2是多核的!
编辑:
dispatch_get_global_queue
的文档:
返回给定优先级的着名全局并发队列。
答案 1 :(得分:6)
您刚才说明了为什么不应该在dispatch_async
内调用非线程安全的方法。如果有足够的处理内核来执行更多作业,GCD将继续进行处理,无论给定队列中的先前作业是否已返回。通过使用以下命令创建自己的队列,可以在OS X 10.7中实现相同的行为:
dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
显然NSLog()
可以随心所欲地调用,而不必担心会出现错误的访问错误或类似情况,但如果您担心线程安全或作业返回的顺序会考虑使用调度组。< / p>
答案 2 :(得分:0)
dispatch_get_global_queue
是一种并发队列。当你为high1和high2指定相同的优先级时,结果是high1和high2的混合。在那之后,它将是低结果,因为它具有较低的优先级。