dispatch_get_global_queue行为

时间:2011-07-29 11:16:31

标签: iphone grand-central-dispatch

以下代码:

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块完成吗?

3 个答案:

答案 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的混合。在那之后,它将是低结果,因为它具有较低的优先级。