【发布时间】:2011-12-15 19:56:54
【问题描述】:
从我读到的关于 Grand Central Dispatch 的文章中,GCD 不做抢先式多任务处理;这都是一个单一的事件循环。我无法理解这个输出。我有两个队列只是在做一些输出(起初我正在读/写一些共享状态,但我能够简化到这个并且仍然得到相同的结果)。
dispatch_queue_t authQueue = dispatch_queue_create("authQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t authQueue2 = dispatch_queue_create("authQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(authQueue, ^{
NSLog(@"First Block");
NSLog(@"First Block Incrementing");
NSLog(@"First Block Incremented");
});
dispatch_async(authQueue, ^{
NSLog(@"Second Block");
NSLog(@"Second Block Incrementing");
NSLog(@"Second Block Incremented");
});
dispatch_async(authQueue2,^{
NSLog(@"Third Block");
NSLog(@"Third Block Incrementing");
NSLog(@"Third Block Incremented");
});
我得到以下输出:
2011-12-15 13:47:17.746 App[80376:5d03] Third Block
2011-12-15 13:47:17.746 App[80376:1503] First Block
2011-12-15 13:47:17.746 App[80376:5d03] Third Block Incrementing
2011-12-15 13:47:17.746 App[80376:1503] First Block Incrementing
2011-12-15 13:47:17.748 App[80376:1503] First Block Incremented
2011-12-15 13:47:17.748 App[80376:5d03] Third Block Incremented
2011-12-15 13:47:17.750 App[80376:1503] Second Block
2011-12-15 13:47:17.750 App[80376:1503] Second Block Incrementing
2011-12-15 13:47:17.751 App[80376:1503] Second Block Incremented
很明显,这些块不会自动执行。我唯一的理论是 GCD 通过 NSLog 写入 stdio 会使当前执行等待。我在 Apple 文档中找不到与此相关的任何内容。谁能解释一下?
【问题讨论】:
标签: ios cocoa concurrency grand-central-dispatch nslog