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
:返回给定优先级的众所周知的全局并发队列.
您已经说明了为什么不应该调用内部不是线程安全的方法dispatch_async
.如果有足够的处理内核来执行更多作业,GCD将继续进行处理,无论给定队列中的先前作业是否已返回.通过使用以下命令创建自己的队列,可以在OS X 10.7中实现相同的行为:
dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
Run Code Online (Sandbox Code Playgroud)
显然NSLog()
可以随心所欲地调用,而不必担心出现错误的访问错误或类似情况,但如果您担心线程安全或您的作业返回的顺序考虑使用调度组.