dispatch_get_global_queue行为

Ash*_*had 28 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

导致高1,高2和低原木的混合物.

如何同时打印high1和high2日志.在同一个队列中不是high1和high2博客?那么在开始执行high2块之前不应该将high1块完成?

joe*_*ick 22

这取决于你正在运行的机器.我怀疑你在Mac上运行它,因为GCD会自动为特定系统创建足够的线程来处理全局队列中的作业.因此,您可能拥有多个核心,因此GCD正在两个核心上运行您的作业.

如果使用创建队列dispatch_queue_create,则会得到一个串行队列,然后保证FIFO行为.

FWIW(虽然你不应该依赖这种行为),如果你在iPhone上运行它,我怀疑你会看到串行队列行为,因为你的iPhone是单核的.不要依赖于此,我认为iPad 2是多核的!

编辑:

文档dispatch_get_global_queue:返回给定优先级的众所周知的全局并发队列.


Chr*_*rth 7

您已经说明了为什么不应该调用内部不是线程安全的方法dispatch_async.如果有足够的处理内核来执​​行更多作业,GCD将继续进行处理,无论给定队列中的先前作业是否已返回.通过使用以下命令创建自己的队列,可以在OS X 10.7中实现相同的行为:

dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
Run Code Online (Sandbox Code Playgroud)

显然NSLog()可以随心所欲地调用,而不必担心出现错误的访问错误或类似情况,但如果您担心线程安全或您的作业返回的顺序考虑使用调度组.